8

Как проверить, существует ли функция в JavaScript?

1

Описание проблемы

У меня есть следующий код:

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 ответ(ов)

16

Попробуйте сделать что-то вроде этого:

if (typeof me.onChange !== "undefined") { 
    // безопасно использовать функцию
}

Или, что еще лучше (по комментарию, который получил много голосов от UpTheCreek):

if (typeof me.onChange === "function") { 
    // безопасно использовать функцию
}
1

У меня была такая проблема. Условие if (obj && typeof obj === 'function') { ... } выдавало ошибку ссылки, если obj оказывался undefined, поэтому в итоге я сделал так:

if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }

Однако, мой коллега указал, что проверка на !== 'undefined', а затем на === 'function' избыточна, поэтому:

Проще:

if (typeof obj === 'function') { ... }

Это гораздо чище и работает отлично.

0

Если вы используете 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, а не наоборот.

0

Не увидел этого в предложениях.

Короче говоря, если me.onChange равно undefined (что будет, если оно не было инициализировано), то последняя часть не выполнится. Если me.onChange — это функция, то будет вызвана me.onChange(str).

Можно даже пойти дальше и сделать так:

me && me.onChange && me.onChange(str);

Это будет полезно на случай, если me также асинхронен.

0

Самый простой способ для меня:

function func_exists(fname) {
  return (typeof window[fname] === 'function');
}

Этот код определяет функцию func_exists, которая проверяет, существует ли функция с именем fname в глобальном объекте window. Если да, то функция возвращает true, в противном случае — false.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь