如何判断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") |
请注意,如果回调是undefined,null,0或false,则回调(按本身)的值为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
我一直在寻找如何检查是否定义了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();
} |