【发布时间】:2010-09-10 07:01:04
【问题描述】:
如何判断 JavaScript 中的函数是否已定义?
我想做这样的事情
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
但它给了我一个
回调不是函数
未定义回调时出错。
【问题讨论】:
标签: javascript reflection
如何判断 JavaScript 中的函数是否已定义?
我想做这样的事情
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
但它给了我一个
回调不是函数
未定义回调时出错。
【问题讨论】:
标签: javascript reflection
我宁愿建议以下功能:
function isFunction(name) {
return eval(`typeof ${name} === typeof Function`);
}
【讨论】:
这对我有用
if( cb && typeof( eval( cb ) ) === "function" ){
eval( cb + "()" );
}
【讨论】:
如果你想重新定义函数,最好使用函数变量,这些变量是按照它们出现的顺序定义的,因为函数是全局定义的,不管它们出现在哪里。
创建一个调用之前同名函数的新函数示例:
A=function() {...} // first definition
...
if (typeof A==='function')
oldA=A;
A=function() {...oldA()...} // new definition
【讨论】:
如果不是所有以前的答案,大多数(如果不是全部)都会对调用函数产生副作用
最佳实践
你有功能
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');
【讨论】:
我可能会这样做
try{
callback();
}catch(e){};
我知道有一个公认的答案,但没有人建议这样做。我不确定这是否符合惯用语的描述,但它适用于所有情况。
在较新的 JavaScript 引擎中,可以使用 finally 代替。
【讨论】:
typeof callback。
accepted_types.indexOf(typeof value) !== -1 以查看它是否在一系列类型中。在这种情况下,我认为例外情况会令人望而却步。
试试:
if (!(typeof(callback)=='undefined')) {...}
【讨论】:
试试:
if (typeof(callback) == 'function')
【讨论】:
对于全局函数,您可以使用这个而不是答案之一中建议的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,但是我不知道。 Function 的值在不同的框架中会有所不同,因此它只能在单个框架应用程序中正常工作。这就是为什么我们通常使用typeof 来代替。请注意,在某些环境中,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,但它们的作用几乎相同。
【讨论】:
如果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();
}
}
限制是它总是会执行回调参数,尽管它是未定义的。
【讨论】:
typeof(callback) == "function"
【讨论】:
typeof callback === "function"
【讨论】:
如果你查看@Venkat Sudheer Reddy Aedama 提到的库的source,下划线js,你可以看到:
_.isFunction = function(obj) {
return typeof obj == 'function' || false;
};
这只是我的提示,提示答案:>
【讨论】:
一线解决方案:
function something_cool(text, callback){
callback && callback();
}
【讨论】:
所有当前答案都使用文字字符串,如果可能的话,我宁愿在我的代码中不使用该字符串 - 这不会(并提供有价值的语义含义,以便启动):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
就个人而言,我尝试减少代码中的字符串数量...
另外,虽然我知道typeof 是一个运算符而不是一个函数,但使用使其显示为后者的语法并没有什么坏处。
【讨论】:
isFunction(not_defined)),其中not_defined是未定义的函数名称,FireBug返回not_defined is not defined,这是正确的,但你的函数应该返回false并且不会产生错误......
not_defined 以传递它值isFunction() 并且无法解决它。对isFunction()的定义无能为力解决这个问题。
isFunction 的功能而只使用(typeof no_function == typeof Function)。
typeof(Function()),因为 Function 是一个函数;但 Array、Object 和其他内置原型也是如此(因为没有更好的术语)。例如,如果您正在检查数组,则不会使用 typeof(array) === typeof(Array);你会使用typeof(array) === typeof(Array()),因为如果你小心且一致,你实际上需要评估函数。
我一直在寻找如何检查是否定义了 jQuery 函数,但我没有找到它。
也许可能需要它;)
if(typeof jQuery.fn.datepicker !== "undefined")
【讨论】:
type0f($.datepicker) !== undefiled 相同,否则为object
如果你使用http://underscorejs.org,你有: http://underscorejs.org/#isFunction
_.isFunction(callback);
【讨论】:
JavaScript 新手我不确定行为是否发生了变化,但如果未定义可能的函数,Jason Bunting(6 年前)给出的解决方案将不起作用。
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
当引擎尝试解析符号 possibleFunction 时,这将引发 ReferenceError: possibleFunction is not defined 错误(如 Jason 的回答中提到的 cmets)
为避免这种行为,您只能传递要检查它是否存在的函数的名称。所以
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
这会将变量设置为您要检查的函数或未定义的空对象,从而避免上述问题。
【讨论】:
试试这个:
callback instanceof Function
【讨论】:
if (callback && typeof(callback) == "function")
请注意,如果是 undefined、null、0 或 false,回调(单独)的计算结果为 false。与null 相比过于具体。
【讨论】:
callback 本身的计算结果为“false-y”值,则其 typeof永远不会为“function”。
如果没有定义变量,那些判断函数是否实现的方法也会失败,所以我们使用了更强大的支持接收字符串的方法:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
【讨论】:
typeof window.doesthisexist 而不是doesthisexist。但是,如图所示使用 eval(which: is evil)仅适用于命名函数 - 这不适用于问题中的用例。
if ('function' === typeof callback) ...
【讨论】:
if(typeof Function === typeof callback)... 怎么样? :)
typeof 的调用稍后会返回不同的内容(可能是“函数”而不是“函数”),因为 JavaScript 的新/不同实现 - 它 feels 新的/不同的实现不太可能破坏typeof Function === typeof callback 检查,因为它在语义级别应该是相同的。
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}
【讨论】: