如何判断一个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
如果它是undefined
, null
, 0
或false
。 与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 f
exception,例如,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(); }