Как проверить, существует ли функция в JavaScript?
Описание проблемы
У меня есть следующий код:
function getID(swfID) {
if (navigator.appName.indexOf("Microsoft") != -1) {
me = window[swfID];
} else {
me = document[swfID];
}
}
function js_to_as(str) {
me.onChange(str);
}
Однако иногда функция onChange
не загружается, и в Firebug я получаю ошибку:
me.onChange is not a function
Я хочу, чтобы мой код работал более устойчиво, так как это не критически важная функция в моем приложении. При использовании typeof
также возникает та же ошибка.
Как мне убедиться, что функция onChange
существует, прежде чем вызывать ее?
(Ни один из методов ниже, кроме конструкции try-catch, не работает.)
5 ответ(ов)
Попробуйте сделать что-то вроде этого:
if (typeof me.onChange !== "undefined") {
// безопасно использовать функцию
}
Или, что еще лучше (по комментарию, который получил много голосов от UpTheCreek):
if (typeof me.onChange === "function") {
// безопасно использовать функцию
}
У меня была такая проблема. Условие if (obj && typeof obj === 'function') { ... }
выдавало ошибку ссылки, если obj
оказывался undefined
, поэтому в итоге я сделал так:
if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }
Однако, мой коллега указал, что проверка на !== 'undefined'
, а затем на === 'function'
избыточна, поэтому:
Проще:
if (typeof obj === 'function') { ... }
Это гораздо чище и работает отлично.
Если вы используете eval
для преобразования строки в функцию и хотите проверить, существует ли эта функция, вам следует воспользоваться оператором typeof и вашей строкой функции внутри eval:
var functionString = "nonexsitantFunction";
eval("typeof " + functionString); // возвращает "undefined" или "function"
Не делайте обратное и не пытайтесь использовать typeof на eval. Если вы попытаетесь сделать это, будет выброшено исключение ReferenceError:
var functionString = "nonexsitantFunction";
typeof(eval(functionString)); // возвращает ReferenceError: [function] is not defined
Таким образом, правильный метод проверки существования функции — это использовать typeof
внутри eval
, а не наоборот.
Не увидел этого в предложениях.
Короче говоря, если me.onChange
равно undefined
(что будет, если оно не было инициализировано), то последняя часть не выполнится. Если me.onChange
— это функция, то будет вызвана me.onChange(str)
.
Можно даже пойти дальше и сделать так:
me && me.onChange && me.onChange(str);
Это будет полезно на случай, если me
также асинхронен.
Самый простой способ для меня:
function func_exists(fname) {
return (typeof window[fname] === 'function');
}
Этот код определяет функцию func_exists
, которая проверяет, существует ли функция с именем fname
в глобальном объекте window
. Если да, то функция возвращает true
, в противном случае — false
.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"