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

2020/10/04 02:01 · javascript ·  · 0评论

如何判断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,如果是undefinednull0,或false与之比较null过于具体。

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

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

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

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;

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

尝试:

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

我可能会做

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

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

在较新的JavaScript引擎中,finally可以改为使用a

尝试:

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

尝试这个:

callback instanceof Function

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

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

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

如果您使用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,但是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,但是它们几乎一样。

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

这是最佳做法

你有功能

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

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

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

A=function() {...} // first definition
...
if (typeof A==='function')
   oldA=A;
A=function() {...oldA()...} // new definition

这对我有用

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

一线解决方案:

function something_cool(text, callback){
    callback && callback();
}
本文地址:http://javascript.askforanswer.com/ruhepanduanshifoudingyilejavascripthanshu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!