如何判断 JavaScript 中的函数是否已定义?
我想要做类似于这样的操作:
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
当回调函数未定义时,会出现“callback is not a function”的错误。
如何判断 JavaScript 中的函数是否已定义?
我想要做类似于这样的操作:
function something_cool(text, callback) {
alert(text);
if( callback != null ) callback();
}
当回调函数未定义时,会出现“callback is not a function”的错误。
typeof callback === "function"
所有当前的答案都使用了字符串字面值,但如果可能的话,我希望在我的代码中不要出现它 - 这种方法则不会(并提供有价值的语义意义):
function isFunction(possibleFunction) {
return typeof(possibleFunction) === typeof(Function);
}
就我个人而言,在我的代码中,我尽量减少字符串的数量...
此外,虽然我知道typeof
是一个操作符而不是函数,但使用让其看起来像函数的语法几乎没有什么危害。
isFunction(not_defined))
,其中 not_defined
是一个未被定义的函数名称,FireBug 返回了 not_defined is not defined
,这是正确的,但是你的函数应该返回 false 而不是生成错误... - Wookie88isFunction
函数,直接使用 (typeof no_function == typeof Function)
。 - netiultypeof(Function())
,因为Function是一个函数;但是Array、Object和其他内置原型(缺乏更好的术语)也是函数。例如,如果你要检查一个数组,你不会使用 typeof(array) === typeof(Array)
,而是应该使用 typeof(array) === typeof(Array())
,因为如果你想要谨慎和一致,你实际上需要评估这个函数。 - seanmhansonif (callback && typeof(callback) == "function")
注意,如果回调函数是undefined
, null
, 0
, 或者false
,那么仅使用callback(不带括号)的值为false
。与null
进行比较太具体化了。
callback
本身评估为“false-y”值,则它的 typeof 永远不可能是“function”。 - Joe如果变量未定义,那些判断函数是否实现的方法也会失败,因此我们使用了更强大的支持接收字符串的方法:
function isFunctionDefined(functionName) {
if(eval("typeof(" + functionName + ") == typeof(Function)")) {
return true;
}
}
if (isFunctionDefined('myFunction')) {
myFunction(foo);
}
typeof window.doesthisexist
而不是 doesthisexist
。然而,使用 eval(即:邪恶)如所示,只能与命名函数一起使用 - 这在问题的用例中无法工作。 - AD7six使用 可选链与函数调用,您可以进行以下操作:
function something_cool(text, callback) {
alert(text);
callback?.();
}
如果callback
是一个函数,它将被执行。
如果callback
为null
或undefined
,则不会抛出错误,也不会发生任何事情。
然而,如果callback
是其他类型的(例如字符串或数字),仍将抛出TypeError。
我可能会做
try{
callback();
}catch(e){};
我知道已经有了一个被接受的答案,但是没有人建议这个。我不确定这是否符合习惯用语的描述,但它适用于所有情况。
在较新的JavaScript引擎中可以使用finally
来替代。
typeof callback
。 - Quentin Englesaccepted_types.indexOf(typeof value) !== -1
检查它是否在一系列类型中。在这种情况下,我认为异常会起到限制作用。 - Quentin Engles尝试:
if (typeof(callback) == 'function')
我刚开始学习JavaScript,不确定行为是否有所改变,但是Jason Bunting(6年前)给出的解决方案如果possibleFunction未定义,则无法正常工作。
function isFunction(possibleFunction) {
return (typeof(possibleFunction) == typeof(Function));
}
如果引擎尝试解析符号possibleFunction(如Jason的答案中所述),则会抛出ReferenceError:possibleFunction未定义的错误。
为避免此行为,您只能传递要检查其是否存在的函数名称。因此,
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
这段代码会将一个变量设为你想要检查的函数,如果没有定义,则设置为空对象,从而避免了上述提到的问题。
typeof(callback) == "function"
function something_cool(text, callback){
alert(text);
if(typeof(callback)=='function'){
callback();
};
}