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

我想做这样的事情

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

但是它得到了一个

回调不是函数

未定义回调时发生错误。


当前回答

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

其他回答

所有当前的答案都使用一个字面字符串,如果可能的话,我更喜欢在我的代码中没有-这不是(并且提供了有价值的语义含义,引导):

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

就我个人而言,我试图减少代码中存在的字符串数量……


此外,虽然我知道typeof是一个操作符而不是一个函数,但使用语法使它看起来像后者并没有什么害处。

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

我可能会

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

我知道有一个公认的答案,但没人这么建议。我不确定这是否符合惯用语的描述,但它适用于所有情况。

在较新的JavaScript引擎中,可以使用finally代替。

如果变量没有定义,那些判断函数是否实现的方法也会失败,所以我们使用了更强大的支持接收字符串的方法:

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

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}