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

我想做这样的事情

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

但它让我

回调不是一个函数

未定义回调时出错。

有帮助吗?

解决方案

typeof callback === "function"

其他提示

当前的所有答案都使用文字字符串,如果可能的话,我希望在我的代码中不要使用文字字符串 - 这不会(并且提供了有价值的语义含义):

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

就我个人而言,我尝试减少代码中的字符串数量......


另外,虽然我知道 typeof 是一个运算符而不是一个函数,使用使其显示为后者的语法几乎没有什么坏处。

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

请注意,回调(本身)的计算结果为 false 如果是 undefined, null, 0, , 或者 false. 。相比于 null 过于具体。

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

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

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

对于 JavaScript 新手,我不确定行为是否已改变,但如果未定义 possibleFunction,Jason Bunting(6 年前)给出的解决方案将不起作用。

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

这会抛出一个 ReferenceError: possibleFunction is not defined 当引擎尝试解析符号 possibleFunction 时出现错误(如 Jason 答案的评论中所述)

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

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

这将变量设置为您要检查的函数或空对象(如果未定义),从而避免了上述问题。

尝试:

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

我可能会做

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

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

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

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

尝试这个:

callback instanceof Function

如果你看一下 来源 @Venkat Sudheer Reddy Aedama 提到的库的 underscorejs,你可以看到这个:

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

这只是我的提示,提示答案:>

尝试:

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

如果你使用 http://underscorejs.org, , 你有:http://underscorejs.org/#isFunction

_.isFunction(callback);

我正在寻找如何检查 jQuery 函数是否已定义,但我没有轻易找到它。

也许可能需要它;)

if(typeof jQuery.fn.datepicker !== "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();
    }
}

限制是它总是会执行回调参数,尽管它是未定义的。

对于全局函数,您可以使用这个函数而不是 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 也是如此,但是据我所知。的价值 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, ,但他们的做法几乎相同。

大多数(如果不是全部)以前的答案都会对调用该函数产生副作用

这里是最佳实践

你有功能

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');

一线解决方案:

function something_cool(text, callback){
    callback && callback();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top