关于反射:如何判断是否定义了JavaScript函数

关于反射:如何判断是否定义了JavaScript函数

How to tell if a JavaScript function is defined

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

我想做这样的事情

1
2
3
4
function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

但这让我

callback is not a function

未定义回调时出错。


1
typeof callback ==="function"

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

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

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

另外,虽然我知道typeof是运算符而不是函数,但是使用使它看起来像后者的语法几乎没有什么害处。


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

请注意,如果回调是undefinednull0false,则回调(按本身)的值为false。与null相比过于具体。


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

1
2
3
4
5
6
7
8
9
function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName +") == typeof(Function)")) {
        return true;
    }
}

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


JavaScript的新手,我不确定行为是否已更改,但如果未定义均可能的功能,Jason Bunting(6年前)给出的解决方案将无法正常工作。

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

当引擎尝试解析符号possibleFunction时,这将引发ReferenceError: possibleFunction is not defined错误(如Jason答案的注释中所述)

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

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

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


尝试:

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

1
typeof(callback) =="function"

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

我可能会做

1
2
3
try{
    callback();
}catch(e){};

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

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


1
2
3
4
5
6
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){
        callback();
    };
}

如果您查看提到的underscorejs库@Venkat Sudheer Reddy Aedama的资源,您会看到以下内容:

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

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


尝试:

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

尝试这个:

1
callback instanceof Function

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

1
_.isFunction(callback);


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

也许可能需要它;)

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

这对我有用

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

如果您在函数中调用的callback()不只是一次,则可以初始化参数以供重用:

1
callback = (typeof callback ==="function") ? callback : function(){};

例如:

1
2
3
4
5
6
7
8
9
10
11
12
function something_cool(text, callback) {
    // Initialize arguments
    callback = (typeof callback ==="function") ? callback : function(){};

    alert(text);

    if (text==='waitAnotherAJAX') {
        anotherAJAX(callback);
    } else {
        callback();
    }
}

限制是,尽管未定义,它将始终执行回调参数。


对于全局函数,您可以使用此函数而不是答案之一中建议的eval

1
2
3
4
5
6
7
8
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具有"对象"类型。

通过本地功能,您可以使用已接受答案中的一个。您也可以测试该功能是本地的还是全局的。

1
2
3
4
5
if (typeof(f) =="function")
    if (global.f === f)
        console.log("f is a global function");
    else
        console.log("f is a local function");

为了回答这个问题,示例代码对我来说是最新的浏览器,没有错误,因此我不确定这是什么问题:

1
2
3
4
function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

注意:我将使用callback !== undefined而不是callback != null,但是它们几乎相同。


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

这是最佳做法

你有功能

1
2
3
function myFunction() {
        var x=1;
    }

直接测试的方法

1
2
3
4
5
//direct way
        if( (typeof window.myFunction)=='function')
            alert('myFunction is function')
        else
            alert('myFunction is not defined');

使用字符串,因此您只能在一个位置定义函数名称

1
2
3
4
5
6
//byString
        var strFunctionName='myFunction'
        if( (typeof window[strFunctionName])=='function')
            alert(s+' is function');
        else
            alert(s+' is not defined');


如果您想重新定义函数,则最好使用按其出现顺序定义的函数变量,因为函数是全局定义的,无论它们出现在何处。

创建一个新函数的示例,该函数调用同一个先前的函数:

1
2
3
4
5
A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition

一线解决方案:

1
2
3
function something_cool(text, callback){
    callback && callback();
}


推荐阅读

    linux命令定义详解?

    linux命令定义详解?,工作,系统,管理,命令,信息,单位,数据,基础,简介,目录,Lin

    linux调用函数的命令?

    linux调用函数的命令?,系统,代码,策略,上调,时间,设计,通信,网络,设备,项目,

    linux命令和库函数?

    linux命令和库函数?,系统,标准,管理,地址,服务,库函数,环境,平台,第一,状态,1

    linux查看函数命令?

    linux查看函数命令?,系统,信息,名称,命令,位置,情况,公用,名字,标准,资料,lin

    创建自定义命令linux?

    创建自定义命令linux?,工具,状态,命令,系统,代码,标准,数据,位置,电脑,材料,L

    linux自定义命令行?

    linux自定义命令行?,系统,工作,名称,百度,命令,管理,工具,位置,信息,终端,Lin

    linux配置自定义命令?

    linux配置自定义命令?,服务,系统,状态,策略,周期,地方,标准,新增,环境,工具,L

    自定义命令linux命令?

    自定义命令linux命令?,工具,系统,数据,命令,新增,代理,通信,地方,信息,时间,

    linux命令行定义参数?

    linux命令行定义参数?,系统,信息,名称,实时,命令,百分比,工作,周期,选项,参

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux自定义简写命令?

    linux自定义简写命令?,系统,工作,命令,标准,地址,基础,信息,软件,目录,文件,

    linux命令简写自定义?

    linux命令简写自定义?,系统,状态,命令,代码,工具,发行,标准,软件,文件,别名,L

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux自定义快捷命令?

    linux自定义快捷命令?,系统,首次,位置,时间,文件,命令,链接,快捷键,终端,桌

    linux查询函数命令?

    linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Lin

    linux自定义全局命令?

    linux自定义全局命令?,环境,系统,命令,别名,新增,信息,地方,文件,定义,用户,