Aar*_*Lee 292 javascript reflection
如何判断JavaScript中的函数是否已定义?
我想做这样的事情
function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}
Run Code Online (Sandbox Code Playgroud)
但它让我了
回调不是一个功能
未定义回调时出错.
Tom*_*ter 452
typeof callback === "function"
Run Code Online (Sandbox Code Playgroud)
        Jas*_*ing 234
所有当前的答案都使用了一个文字字符串,如果可能的话,我更喜欢在我的代码中没有这个字符串 - 这不会(并提供有价值的语义含义,引导):
function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我尝试减少代码中挂着的字符串数量......
此外,虽然我知道这typeof是一个操作符而不是一个函数,但使用语法使其显示为后者几乎没有什么害处.
Rob*_*ird 15
if (callback && typeof(callback) == "function")
Run Code Online (Sandbox Code Playgroud)
需要注意的是回调(本身)的计算结果为false,如果是undefined,null,0,或false.比较null过于具体.
Dar*_*n G 11
使用带有函数调用的可选链,您可以执行以下操作:
function something_cool(text, callback) {
    alert(text);
    callback?.();
}
Run Code Online (Sandbox Code Playgroud)
如果callback是一个函数,它将被执行。
如果callback是null或undefined,则不会引发任何错误并且不会发生任何情况。
然而,如果callback是其他东西,例如字符串或数字,仍然会抛出 TypeError。
小智 8
如果未定义变量,那么判断函数是否实现的方法也会失败,因此我们使用了更强大的函数来支持接收字符串:
function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}
if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
Run Code Online (Sandbox Code Playgroud)
        尝试:
if (typeof(callback) == 'function')
Run Code Online (Sandbox Code Playgroud)
        JavaScript新手我不确定行为是否已经改变,但是如果没有定义可能的函数,Jason Bunting(6年前)给出的解决方案将不起作用.
function isFunction(possibleFunction) {
  return (typeof(possibleFunction) == typeof(Function));
}
Run Code Online (Sandbox Code Playgroud)
这将引发ReferenceError: possibleFunction is not defined错误,因为引擎试图解析符号possibleFunction(如对Jason的回答中提到的那样)
要避免此行为,您只能传递要检查的函数的名称(如果存在).所以
var possibleFunction = possibleFunction || {};
if (!isFunction(possibleFunction)) return false;
Run Code Online (Sandbox Code Playgroud)
这将变量设置为要检查的函数,或者如果未定义,则将空对象设置为空对象,从而避免上述问题.
我可能会
try{
    callback();
}catch(e){};
Run Code Online (Sandbox Code Playgroud)
我知道有一个公认的答案,但没有人建议这样做。我不确定这是否符合惯用语的描述,但它适用于所有情况。
在较新的 JavaScript 引擎中,finally可以使用 a 代替。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           163157 次  |  
        
|   最近记录:  |