如何判断JavaScript中的函数是否已定义?
我想做这样的事情
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
但是它得到了一个
回调不是函数
未定义回调时发生错误。
如何判断JavaScript中的函数是否已定义?
我想做这样的事情
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
但是它得到了一个
回调不是函数
未定义回调时发生错误。
当前回答
Try:
if (!(typeof(callback)=='undefined')) {...}
其他回答
如果希望重新定义函数,最好使用函数变量,因为函数是全局定义的,无论它们出现在哪里。
创建一个新函数,调用之前同名的函数:
A=function() {...} // first definition
...
if (typeof A==='function')
oldA=A;
A=function() {...oldA()...} // new definition
所有当前的答案都使用一个字面字符串,如果可能的话,我更喜欢在我的代码中没有-这不是(并且提供了有价值的语义含义,引导):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
就我个人而言,我试图减少代码中存在的字符串数量……
此外,虽然我知道typeof是一个操作符而不是一个函数,但使用语法使它看起来像后者并没有什么害处。
typeof(callback) == "function"
大多数(如果不是所有)前面的答案都有调用该函数的副作用
以下是最佳实践
你有函数
函数myFunction() { var x = 1; } 直接测试的方法
/ /直接的方式 if((typeof window.myFunction)=='function') alert('myFunction是函数') 其他的 alert('myFunction未定义'); 使用字符串,因此只能在一个位置定义函数名
/ / byString var strFunctionName = ' myFunction ' if((typeof window[strFunctionName])=='function') Alert (s+' is function'); 其他的 警报(s+'未定义');
对于全局函数,您可以使用这个函数来代替答案中建议的eval。
var global = (function (){
return this;
})();
if (typeof(global.f) != "function")
global.f = function f1_shim (){
// commonly used by polyfill libs
};
你可以使用global。f instanceof函数也一样,但是afaik。Function的值在不同的帧中是不同的,所以它只能在单个帧应用中正常工作。这就是为什么我们通常用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,但它们的作用几乎相同。