it-swarm.cn

如何判断是否定义了JavaScript函数

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

我想做这样的事情

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

但它让我了

回调不是一个功能

未定义回调时出错。

272
Aaron Lee
typeof callback === "function"
424
Tom Ritter

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

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

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


此外,虽然我知道typeof是一个操作符而不是一个函数,但使用语法使其显示为后者几乎没有什么害处。

229
Jason Bunting
if (callback && typeof(callback) == "function")

请注意,如果falseundefined0null,则回调(单独)将计算为false。与null相比,过于具体。

13
Robin like the bird

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

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

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

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

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

当引擎尝试解析符号possibleFunction时会抛出ReferenceError: possibleFunction is not defined错误(如Jason的回答中所述)

要避免此行为,您只能传递要检查的函数的名称(如果存在)。所以

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

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

6
NectarSoft

尝试:

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

我可能会这样做

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

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

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

4
Quentin Engles
if ('function' === typeof callback) ...
4
Andrew Hedges
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}
3
ConroyP

试试这个:

callback instanceof Function
2
eWolf

尝试:

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

如果你看一下@Venkat Sudheer Reddy Aedama提到的库的 source ,下划线,你可以看到:

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

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

2
VentyCZ

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

_.isFunction(callback);
1

我一直在寻找如何检查是否定义了jQuery函数,并且我没有轻易找到它。

也许可能需要它;)

if(typeof jQuery.fn.datepicker !== "undefined")
1
miguelmpn

对于全局函数,您可以使用此函数而不是其中一个答案中建议的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
inf3rno

大多数(如果不是全部)先前的答案都有调用函数的副作用

这里是最佳实践

你有功能

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
TexWiller

如果你在函数中调用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
Nick Tsai