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

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

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

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

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

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

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

Ответы [ 19 ]

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

Попробуйте:

if (!(typeof(callback)=='undefined')) {...}
2 голосов
/ 10 мая 2012

Попробуйте это:

callback instanceof Function
2 голосов
/ 17 апреля 2016

Если вы посмотрите на источник библиотеки @Venkat Sudheer Reddy Aedama, упомянутой ниже, подчеркивание, вы можете увидеть это:

_.isFunction = function(obj) {
  return typeof obj == 'function' || false;
};

Это просто моя подсказка, подсказка:>

1 голос
/ 04 июня 2015

Я искал, как проверить, была ли определена функция jQuery, и я не нашел ее легко.

Возможно, это может понадобиться;)

if(typeof jQuery.fn.datepicker !== "undefined")
1 голос
/ 29 января 2015

Если вы используете http://underscorejs.org,, у вас есть: http://underscorejs.org/#isFunction

_.isFunction(callback);
0 голосов
/ 20 января 2018

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

здесь лучшие практики

у вас есть функция

function myFunction() {
        var x=1;
    }
прямой способ проверить это

//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');
используя строку, чтобы вы могли иметь только одно место для определения имени функции

//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');
0 голосов
/ 14 октября 2017

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

var global = (function (){
    return this;
})();

if (typeof(global.f) != "function")
    global.f = function f1_shim (){
        // commonly used by polyfill libs
    };

Вы также можете использовать global.f instanceof Function, но afaik. значение Function будет отличаться в разных кадрах, поэтому оно будет правильно работать только с приложением из одного кадра. Вот почему мы обычно используем typeof вместо этого. Обратите внимание, что в некоторых средах могут быть аномалии и с typeof f, например, согласно MSIE 6-8 некоторые функции, например alert, имели тип "объект".

По локальным функциям вы можете использовать тот, который принят в ответе. Вы можете проверить, является ли функция локальной или глобальной.

if (typeof(f) == "function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

Чтобы ответить на вопрос, пример кода работает для меня без ошибок в последних браузерах, поэтому я не уверен, что с ним было:

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

Примечание: я бы использовал callback !== undefined вместо callback != null, но они делают почти то же самое.

0 голосов
/ 14 октября 2017

Если callback(), который вы вызываете не только один раз в функции, вы можете инициализировать аргумент для повторного использования:

callback = (typeof callback === "function") ? callback : function(){};

Например:

function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback === "function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

Ограничением является то, что он всегда будет выполнять аргумент обратного вызова, хотя он не определен.

0 голосов
/ 18 января 2016

Однолинейное решение:

function something_cool(text, callback){
    callback && callback();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...