关于反射:如何判断是否定义了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();
}


推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    电脑开机声音如何判断故障?

    电脑开机声音如何判断故障?,故障,声音,系统,台式机主机主板上如果安装有小蜂鸣器,在电脑出现故障时会发出报警,通过报警判断故障时应考虑当前

    如何判断硬盘是否能得到保证

    如何判断硬盘是否能得到保证,,虽然说,从正当渠道购买的新硬盘都自动享有一定年限的保修服务,但这并不是说在这个年限内一定可以享有这种服务

    双显的环境,独立显卡如何判断坏了?

    双显的环境,独立显卡如何判断坏了?,显卡,判断,独立,这个很好判断,打开设备管理器查看一下自己的独立显卡有没有出现感叹号,是不是运转正常就可

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个