Как определить, определена ли функция JavaScript - PullRequest
275 голосов
/ 17 сентября 2008

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

Я хочу сделать что-то подобное

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

Но это дает мне

обратный вызов не является функцией

ошибка, когда обратный вызов не определен.

Ответы [ 19 ]

428 голосов
/ 17 сентября 2008
typeof callback === "function"
229 голосов
/ 17 сентября 2008

Все текущие ответы используют буквальную строку, которую я предпочитаю не использовать в своем коде, если это возможно, - это не так (и обеспечивает ценное семантическое значение для загрузки):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

Лично я пытаюсь уменьшить количество строк, которые висят в моем коде ...


Кроме того, хотя мне известно, что typeof является оператором, а не функцией, использование синтаксиса, приводящего к его появлению в качестве последнего, незначительно.

13 голосов
/ 17 сентября 2008
if (callback && typeof(callback) == "function")

Обратите внимание, что обратный вызов (сам по себе) оценивается как false, если он undefined, null, 0 или false. Сравнение с null слишком специфично.

7 голосов
/ 21 сентября 2010

Эти методы, чтобы определить, реализована ли функция, также не работают, если переменная не определена, поэтому мы используем что-то более мощное, которое поддерживает получение строки:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
6 голосов
/ 29 апреля 2014

Впервые в JavaScript Я не уверен, изменилось ли поведение, но решение, данное Джейсоном Бантингом (6 лет назад), не будет работать, если возможная функция не определена.

function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}

Это приведет к ошибке ReferenceError: possibleFunction is not defined, поскольку движок попытается разрешить символ возможной функции (как указано в комментариях к ответу Джейсона)

Чтобы избежать такого поведения, вы можете передать только имя функции, которую вы хотите проверить, если она существует. Так

var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;

Это задает переменную либо как функцию, которую вы хотите проверить, либо как пустой объект, если она не определена, что позволяет избежать проблем, упомянутых выше.

5 голосов
/ 17 сентября 2008

Попробуйте:

if (typeof(callback) == 'function')
4 голосов
/ 18 сентября 2008
if ('function' === typeof callback) ...
4 голосов
/ 17 сентября 2008
typeof(callback) == "function"
4 голосов
/ 24 января 2015

Я мог бы сделать

try{
    callback();
}catch(e){};

Я знаю, что есть принятый ответ, но никто не предложил это. Я не совсем уверен, соответствует ли это описанию idiomatic, но оно работает для всех случаев.

В более новых движках JavaScript вместо * можно использовать finally.

3 голосов
/ 17 сентября 2008
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...