- Как проверить, существует ли функция в JavaScript?
- 20 ответов
- Object.prototype.hasOwnProperty()
- Синтаксис
- Параметры
- Описание
- Примеры
- Пример: использование hasOwnProperty для проверки существования свойства
- Пример: собственные и унаследованные свойства
- Пример: обход свойств объекта
- Пример: hasOwnProperty как свойство
- Спецификации
- Совместимость с браузерами
- Смотрите также
- Found a content problem with this page?
- Javascript есть ли метод
Как проверить, существует ли функция в JavaScript?
и полностью останавливается. Я хочу, чтобы он деградировал изящно, потому что это не самая важная функция в моей программе. Я попробовал typeof , но это все равно дает ту же ошибку. Любые предложения о том, как убедиться, что он существует, а затем выполнить только onChange ? (Ни один из методов ниже, кроме try catch one work)
20 ответов
Попробуйте что-то вроде этого:
if (typeof me.onChange !== "undefined") < // safe to use the function >
или еще лучше (в соответствии с комментариями UpTheCreek вверх)
if (typeof me.onChange === "function") < // safe to use the function >
@James, потому что этот оператор фактически выдает undefined исключение в JavaScript. Я попробовал это.
@UpTheCreek, это было бы немного опасно как общее решение, так как более старые версии IE рассматривают определенные функции как объекты, например, typeof window.alert === ‘object’ .
@BornToCode, потому что тогда me.onChange может быть чем-то, что оценивает true , а не обязательно функцией (например, это может быть логическое значение, строка и т. Д.). Например, см. Jsfiddle.net/j5KAF/1
@UpTheCreek и @Noyo: я пропустил ваши комментарии и столкнулся с проблемой. Я только что превратил тест в: ((typeof me.onChange === «function») || (typeof me.onChange === «object»)) Работает нормально вплоть до ie8 в моем случае.
@JulianLaval: хотя в большинстве случаев это верно, дело не в этой странности, с которой он здесь сталкивается. Обязательно прочитайте контекст. Посмотрите на его обновление; он закончил тем, что использовал попытку поймать.
@l00k l00k Я бы вообразил это, чтобы удовлетворить инструменты jslinting. Javascript ужасен для свободной типизации данных, поэтому, если вы можете использовать! == и === вместо! = И ==, то обычно это хорошая практика, просто делать это по умолчанию. Существует редко причина не делать этого.
Просто указать на очевидный typeof me.onChange === «function» не удастся, если этот глобальный me не определен.
if (obj && typeof obj === 'function')
продолжал бросать опорную ошибку, если obj оказался undefined.
В конце я сделал следующее:
if (typeof obj !== 'undefined' && typeof obj === 'function')
Коллега указал мне, что проверка, если он !== ‘undefined’ , а затем === ‘function’ , конечно, избыточен.
Значительно чище и отлично работает.
Изменить: я не претендую на то, чтобы знать причину (причины), почему этот ответ является принятым. Вместо этого используйте предложенное решение в Andrew Hare: https://stackoverflow.com/questions/1042138/javascript-check-if-function-exists
Вот один из способов справиться с такой ситуацией:
function js_to_as( str ) < try < me.onChange(str); >catch(err) < // Handle error(s) here >>
Если вы используете eval для преобразования строки в функцию, и вы хотите проверить, существует ли этот метод eval’d, вам нужно использовать typeof, а вашу строку функций внутри Eval
var functionString = "nonexsitantFunction" eval("typeof " + functionString) // returns "undefined" or "function"
Не отменяйте это и попробуйте typeof на eval. Если вы сделаете ReferenceError, вы будете брошены:
var functionString = "nonexsitantFunction" typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
Object.prototype.hasOwnProperty()
Метод hasOwnProperty() возвращает логическое значение, указывающее, содержит ли объект указанное свойство.
Синтаксис
Параметры
Имя проверяемого свойства.
Описание
Каждый объект, произошедший от Object , наследует метод hasOwnProperty . Этот метод может использоваться для определения того, содержит ли объект указанное свойство в качестве собственного свойства объекта; в отличие от оператора in , этот метод не проверяет существование свойств в цепочке прототипов объекта.
Примеры
Пример: использование hasOwnProperty для проверки существования свойства
В следующем примере определяется, содержит ли объект o свойство с именем prop :
= new Object(); o.prop = 'существует'; function changeO() o.newprop = o.prop; delete o.prop; > o.hasOwnProperty('prop'); // вернёт true changeO(); o.hasOwnProperty('prop'); // вернёт false
Пример: собственные и унаследованные свойства
Следующий пример показывает разницу между собственными свойствами и свойствами, унаследованными через цепочку прототипов:
= new Object(); o.prop = 'существует'; o.hasOwnProperty('prop'); // вернёт true o.hasOwnProperty('toString'); // вернёт false o.hasOwnProperty('hasOwnProperty'); // вернёт false
Пример: обход свойств объекта
Следующий пример показывает, как итерироваться по свойствам объекта с пропуском унаследованных свойств. Обратите внимание, что цикл for. in уже проходит только по перечисляемым элементам, так что не надо на основании отсутствия не перечисляемых свойств, показываемых в цикле, считать, что метод hasOwnProperty сам ограничивает свойства только перечисляемыми элементами (как это делает метод Object.getOwnPropertyNames() ).
var buz = fog: 'stack' >; for (var name in buz) if (buz.hasOwnProperty(name)) alert('это точно туман (' + name + '). Значение: ' + buz[name]); > else alert(name); // toString или что-то ещё > >
Пример: hasOwnProperty как свойство
JavaScript не защищает имя свойства hasOwnProperty ; таким образом, вполне может существовать объект с таким свойством, поэтому для получения правильного результата нужно использовать внешний метод hasOwnProperty :
var foo = hasOwnProperty: function() return false; >, bar: 'Тут драконы' >; foo.hasOwnProperty('bar'); // всегда возвращает false // Используем метод hasOwnProperty другого объекта и вызываем его с передачей foo в качестве this (>).hasOwnProperty.call(foo, 'bar'); // true // Также для этих целей можно использовать свойство hasOwnProperty из прототипа Object Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
Обратите внимание, что в последнем случае новые объекты не создаются.
Спецификации
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
This page was last modified on 22 окт. 2022 г. by MDN contributors.
Your blueprint for a better internet.
Javascript есть ли метод
на одной из страниц открывается попап
в котором при выходе вызывается функция в opener окне,
но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
спасибо.
Здравствуйте, fryky, Вы писали:
F>на одной из страниц открывается попап
F>в котором при выходе вызывается функция в opener окне,
F>но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
F>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
F>спасибо.
Здравствуйте, fryky, Вы писали:
F>на одной из страниц открывается попап
F>в котором при выходе вызывается функция в opener окне,
F>но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
F>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
F>спасибо.
Так же можно проверит наличие функции в родительском окне:
Z>if( ObjectName.MethodName ) < // ObjectName.MethodName - без скобок Z>. Z>> Z>
спасибо за оперативность ))
только я забыл указать. что это делается под IE5
и у него вылетает ошибка ((
Z>>if( ObjectName.MethodName )< // ObjectName.MethodName - без скобок Z>> . Z>>> Z>>
F>спасибо за оперативность ))
F>только я забыл указать. что это делается под IE5
F>и у него вылетает ошибка ((
Странно, к сожалению проверить не могу, т.к. в наличие есть только IE6.
По идее ObjectName.MethodName текст метода или ‘undefined’ — если не определён.
А можно поподробней представить код и сообщение об ошибке?
При первом же обращении в проверке IF он вызывает ошибку, и прерывает дальнейшее выполнение скрипта.
Ие5 скудно ругается
говорит
«неопределенная ошибка» и номер строки
Здравствуйте, fryky, Вы писали:
F>При первом же обращении в проверке IF он вызывает ошибку, и прерывает дальнейшее выполнение скрипта.
F>Ие5 скудно ругается
F>говорит
F>»неопределенная ошибка» и номер строки
Здравствуйте, fryky, Вы писали:
F>на одной из страниц открывается попап
F>в котором при выходе вызывается функция в opener окне,
F>но может произойти так, что страничка в этом окне изменилась, и необходимой функции уже нету. как быть ?
F>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
F>спасибо.
Здравствуйте, Zerger, Вы писали:
/* исправления нужны для IE до версии 5.5 */ Z>if( ObjectName.MethodName + "" != "undefined" )< // ObjectName.MethodName - без скобок Z> . Z>> /* Более общий подход, проверяет всё вплоть до свойств */ if(Object["MemberName"] + "" != "undefined") < /* свойства/метода c именем MemberName не существует */ > Z>
А вообще правильно, для 1.5 яваскрипта правильным будет сравнение с сущностью undefined, а не строкой.
Здравствуйте, fryky, Вы писали:
FF>лудше бы конечно получить ответ на вопрос как проверить существование свойства\метода у объекта.
Стандартный способ — оператор in:
var fso = new ActiveXObject(«Scripting.FileSystemObject»);’какой-нибудь объект
‘проверяем существование метода CreateFolder ():
var exists = «CreateFolder» in fso; ‘получаем значение true или false
window.alert («есть это:» + exists);
Только in не отличает метод от свойства (не получается «GetFolder()» in fso) и объект в выражении с in должен уже существовать (иначе возникнет исключение).
Здравствуйте, Partisan, Вы писали:
P>Стандартный способ — оператор in:
P>var fso = new ActiveXObject(«Scripting.FileSystemObject»);’какой-нибудь объект
P>’проверяем существование метода CreateFolder ():
P>var exists = «CreateFolder» in fso; ‘получаем значение true или false
P>window.alert («есть это:» + exists);
P>Только in не отличает метод от свойства (не получается «GetFolder()» in fso) и объект в выражении с in должен уже существовать (иначе возникнет исключение).
Опа, совсем про него забыл. Одно уточнение, этот оператор появился в Javascript 1.4 и в JScript 1.0 и по-моему его нет в стандарте ECMA, то есть в ECMAScript это точно работать не станет.
И из не IE его поддерживают только последние версии браузеров.