329

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

我想做这样的事情

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

但它让我

回调不是函数

未定义回调时出错。

4

22 回答 22

525
typeof callback === "function"
于 2008-09-17T17:51:50.217 回答
247

当前的所有答案都使用文字字符串,如果可能的话,我宁愿在我的代码中不使用该字符串 - 这不会(并提供有价值的语义含义,以便启动):

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

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


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

于 2008-09-17T18:08:34.467 回答
18
if (callback && typeof(callback) == "function")

请注意,回调(单独)计算false结果是否为undefinednull0false。比较null过于具体。

于 2008-09-17T18:05:36.220 回答
9

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

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

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
于 2010-09-21T16:52:52.827 回答
7

尝试:

if (typeof(callback) == 'function')
于 2008-09-17T17:52:13.837 回答
6

JavaScript 新手我不确定行为是否发生了变化,但如果未定义可能的函数,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;

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

于 2014-04-29T16:47:26.557 回答
6

我可能会

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

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

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

于 2015-01-23T23:53:48.610 回答
5
typeof(callback) == "function"
于 2008-09-17T17:53:46.797 回答
4
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}
于 2008-09-17T17:59:42.477 回答
4
if ('function' === typeof callback) ...
于 2008-09-17T22:50:31.887 回答
3

尝试:

if (!(typeof(callback)=='undefined')) {...}
于 2008-09-17T17:54:40.320 回答
2

试试这个:

callback instanceof Function
于 2012-05-09T22:02:38.890 回答
2

如果您查看@Venkat Sudheer Reddy Aedama 提到的库的来源,underscorejs,您可以看到:

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

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

于 2016-04-16T21:15:38.797 回答
1

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

_.isFunction(callback);
于 2015-01-28T21:01:46.950 回答
1

我一直在寻找如何检查是否定义了 jQuery 函数,但我并不容易找到它。

也许可能需要它;)

if(typeof jQuery.fn.datepicker !== "undefined")
于 2015-06-04T14:51:51.957 回答
1

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

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

于 2017-10-14T09:56:29.923 回答
0

对于全局函数,您可以使用此函数而不是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,但它们的作用几乎相同。

于 2017-10-14T10:26:35.160 回答
0

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

这里是最佳实践

你有功能

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

于 2018-01-20T06:46:08.407 回答
0

如果你想重新定义函数,最好使用函数变量,这些变量是按照它们出现的顺序定义的,因为函数是全局定义的,不管它们出现在哪里。

创建一个调用前一个同名函数的新函数的示例:

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition
于 2019-07-30T14:48:39.833 回答
0

这对我有用

if( cb && typeof( eval( cb ) ) === "function" ){
    eval( cb + "()" );
}
于 2019-09-10T18:24:12.067 回答
-1

我宁愿建议以下功能:

function isFunction(name) {
    return eval(`typeof ${name} === typeof Function`);
}
于 2021-08-18T08:53:44.360 回答
-2

一站式解决方案:

function something_cool(text, callback){
    callback && callback();
}
于 2016-01-18T20:08:50.943 回答