如何判断是否定义了JavaScript中的函数?
我想做这样的事情
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
但它让我得到了一个
未定义回调时出现回调不是函数
错误。
答案 0 :(得分:426)
typeof callback === "function"
答案 1 :(得分:229)
所有当前的答案都使用了一个文字字符串,如果可能的话,我希望在我的代码中没有这个字符串 - 这不会(并提供有价值的语义含义,引导):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
就个人而言,我尝试减少代码中闲置的字符串数量......
此外,虽然我知道typeof
是一个操作符而不是一个函数,但使用语法会使它显示为后者几乎没有什么害处。
答案 2 :(得分:13)
if (callback && typeof(callback) == "function")
请注意,如果回调({1}},false
,undefined
或null
,则回调(单独)会评估为0
。与false
相比过于具体。
答案 3 :(得分:7)
如果未定义变量,那么告诉函数是否实现的方法也会失败,因此我们使用了更强大的函数来支持接收字符串:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
答案 4 :(得分:6)
JavaScript的新手我不确定行为是否已经改变,但Jason Bunting(6年前)给出的解决方案如果没有定义可能的功能则无法工作。
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
当引擎尝试解析符号possibleFunction时会抛出ReferenceError: possibleFunction is not defined
错误(正如Jason的评论中所提到的那样)
要避免此行为,您只能传递要检查的函数的名称(如果存在)。所以
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
这将变量设置为要检查的函数,或者如果未定义则将空对象设置为空对象,从而避免上述问题。
答案 5 :(得分:5)
尝试:
if (typeof(callback) == 'function')
答案 6 :(得分:4)
if ('function' === typeof callback) ...
答案 7 :(得分:4)
我可能会这样做
try{
callback();
}catch(e){};
我知道有一个公认的答案,但没有人建议这样做。我不确定这是否符合惯用语的描述,但它适用于所有情况。
在较新的JavaScript引擎中,可以使用finally
代替。
答案 8 :(得分:3)
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
答案 9 :(得分:3)
typeof(callback) == "function"
答案 10 :(得分:2)
尝试:
if (!(typeof(callback)=='undefined')) {...}
答案 11 :(得分:2)
试试这个:
callback instanceof Function
答案 12 :(得分:2)
如果你看看@Venkat Sudheer Reddy Aedama提到的source库,下划线,你可以看到:
_.isFunction = function(obj) {
return typeof obj == 'function' || false;
};
这只是我的提示,提示答案:>
答案 13 :(得分:1)
如果您使用http://underscorejs.org,则您拥有: http://underscorejs.org/#isFunction
_.isFunction(callback);
答案 14 :(得分:1)
我一直在寻找如何检查是否定义了jQuery函数,并且我没有轻易找到它。
也许可能需要它;)
if(typeof jQuery.fn.datepicker !== "undefined")
答案 15 :(得分:0)
如果你在函数中调用的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();
}
}
限制是它总是会执行回调参数,尽管它是未定义的。
答案 16 :(得分:0)
对于全局函数,您可以使用此函数而不是其中一个答案中建议的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
的一些函数具有" object"类型。
通过本地功能,您可以使用接受答案中的功能。您可以测试该功能是本地功能还是全局功能。
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
,但它们几乎相同。
答案 17 :(得分:0)
大多数(如果不是全部)以前的答案都有副作用来调用函数
这里是最佳实践
你有功能
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');
答案 18 :(得分:0)
如果您想重新定义函数,则最好使用按其出现顺序定义的函数变量,因为函数是全局定义的,无论它们出现在何处。
创建一个新函数的示例,该函数调用同一个先前的函数:
A=function() {...} // first definition
...
if (typeof A==='function')
oldA=A;
A=function() {...oldA()...} // new definition
答案 19 :(得分:0)
这对我有用
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
答案 20 :(得分:-2)
单线解决方案:
function something_cool(text, callback){
callback && callback();
}