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

我想做这样的事情

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

但是它得到了一个

回调不是函数

未定义回调时发生错误。


当前回答

这对我很有效

if( cb && typeof( eval( cb ) ) === "function" ){
    eval( cb + "()" );
}

其他回答

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

Try:

if (typeof(callback) == 'function')

对于全局函数,您可以使用这个函数来代替答案中建议的eval。

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

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

你可以使用global。f instanceof函数也一样,但是afaik。Function的值在不同的帧中是不同的,所以它只能在单个帧应用中正常工作。这就是为什么我们通常用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,但它们的作用几乎相同。

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

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

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


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

if (callback && typeof(callback) == "function")

请注意,如果callback为undefined、null、0或false,则它的计算结果为false。与null的比较过于具体。