如何判断一个Javascript函数是否被定义

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

我想要做这样的事情

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

但它让我一个

callback不是一个函数

callback未定义时出错。

 typeof callback === "function" 

所有当前的答案都使用一个文字string,如果可能的话,我宁愿在我的代码中没有这样的string – 这不会(并且提供有价值的语义含义来引导):

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

就我个人而言,我尝试减less在我的代码中挂起的string的数量…


另外,虽然我意识到typeof是一个操作符而不是一个函数,但是使用语法使得它看起来像是后者。

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

请注意,callback(本身)评估为false如果它是undefinednull0false 。 与null比较过于具体。

JavaScript新手我不确定这个行为是否已经改变,但是如果可能的话没有定义,Jason Bunting(6年前)给出的解决scheme将不会工作。

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

这会抛出一个ReferenceError: possibleFunction is not defined错误,因为引擎试图parsing符号possibleFunction(正如在贾森的回答中提到的那样)

为了避免这种行为,你只能传递你想检查的函数的名字是否存在。 所以

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

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

那些判断一个函数是否被实现的方法也会失败,如果variables没有被定义,那么我们正在使用更强大的支持接收string的东西:

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

尝试

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

尝试这个:

 callback instanceof Function 
 typeof(callback) == "function" 

尝试:

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

我可以这样做

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

我知道有一个被接受的答案,但没有人提出这个build议。 我不太确定这是否符合惯用语的描述,但适用于所有情况。

在较新的js引擎中, finally可以用来代替。

如果你看看图书馆的来源 @Venkat Sudheer Reddy Aedama提到的,可以看到这个:

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

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

我正在寻找如何检查是否定义了一个jQuery函数,我不觉得很容易。

也许可能需要它;)

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

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

 _.isFunction(callback); 

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

限制是它将始终执行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 fexception,例如,MSIE 6-8中的一些function(例如alert具有“对象”types。

通过本地function,您可以使用接受答案中的那个。 你可以testing函数是本地的还是全局的。

 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 ,但他们几乎相同。

一线解决scheme:

 function something_cool(text, callback){ callback && callback(); }