如何判断JavaScript中的函数是否已定义?

我想做这样的事情

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

但是它得到了一个

回调不是函数

未定义回调时发生错误。


当前回答

如果希望重新定义函数,最好使用函数变量,因为函数是全局定义的,无论它们出现在哪里。

创建一个新函数,调用之前同名的函数:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition

其他回答

对于JavaScript新手,我不确定行为是否发生了变化,但如果没有定义可能函数,Jason Bunting(6年前)给出的解决方案将不起作用。

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

这将抛出一个ReferenceError:可能函数没有定义的错误,因为引擎试图解析符号可能函数(正如在Jason的回答的评论中提到的)

为了避免这种行为,您只能传递要检查是否存在的函数的名称。所以

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

这将变量设置为您想要检查的函数,如果它没有定义,则设置为空对象,从而避免了上面提到的问题。

function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}

Try:

if (!(typeof(callback)=='undefined')) {...}

如果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();
    }
}

限制是它将始终执行回调参数,尽管它是未定义的。

使用函数调用的可选链接,你可以做到以下几点:

function something_cool(text, callback) {
    alert(text);
    callback?.();
}

如果callback是一个函数,它将被执行。

如果callback为null或未定义,则不会抛出错误,也不会发生任何事情。

然而,如果callback是其他东西,例如字符串或数字,TypeError仍然会被抛出。