如何判断 JavaScript 函数是否已定义

IT技术 javascript reflection
2021-03-15 22:33:41

如何判断 JavaScript 中的函数是否已定义?

我想做这样的事情

function something_cool(text, callback) {
    alert(text);
    if( callback != null ) callback();
}

但它让我

回调不是函数

未定义回调时出错。

6个回答
typeof callback === "function"
确保删除函数上的括号并仅在 if 条件中使用函数名称,否则将调用该函数而不是为您提供 true 或 false。
2021-05-03 22:33:41
是的,“魔法”是一个草率的、糟糕的词选择——我的意思是“文字字符串”而不是“魔法字符串”。我的错。:)
2021-05-06 22:33:41
2021-05-07 22:33:41
这并不是真正的魔法字符串,因为在 ECMA 规范中精确定义了 typeof 值集。虽然开始时的语法有点愚蠢,但它是完全合理的惯用 Javascript。
2021-05-10 22:33:41
@quixoto - 理解,我想我的意思是无论如何你仍然需要有一个字符串 - 我宁愿没有比绝对需要的更多的文字字符串乱扔我的代码;因此,这不是我测试某些东西是否是函数的理想选择。
2021-05-11 22:33:41

当前所有的答案都使用文字字符串,如果可能的话,我更喜欢在我的代码中不包含它 - 这没有(并提供有value的语义含义,以启动):

function isFunction(possibleFunction) {
  return typeof(possibleFunction) === typeof(Function);
}

就个人而言,我尝试减少代码中的字符串数量......


此外,虽然我知道这typeof是一个运算符而不是一个函数,但使用使其显示为后者的语法几乎没有什么害处。

或者避免使用函数isFunction而只执行(typeof no_function == typeof Function).
2021-04-16 22:33:41
@Wookie88:从技术上讲,我的答案中说明的函数不会返回错误,而是因为 JavaScript 解释器正在尝试解析符号not_defined以将其值传递给但isFunction()未能解析它而导致错误发生没有isFunction()办法解决这个问题的定义
2021-04-21 22:33:41
@JasonBunting 如果你要那么挑剔,你真的应该使用, typeof(Function())因为 Function 是一个函数;但数组、对象和其他内置原型也是如此(因为没有更好的术语)。例如,如果你正在检查一个你不会使用的数组typeof(array) === typeof(Array)你会使用,typeof(array) === typeof(Array())因为如果你小心和一致,你实际上需要评估函数。
2021-05-01 22:33:41
@ZacharyYates 解决 ReferenceError 的方法意味着避免使用对可能未定义函数的引用。您可以在函数调用中进行类型检查并将结果传递给函数。jsfiddle.net/qNaxJ也许没那么好,但至少,没有使用字符串;)
2021-05-11 22:33:41
我应该如何使用这个功能?我试过isFunction(not_defined))在那里not_defined是没有定义的函数名和萤火返回not_defined is not defined这是正确的,但你的函数应该返回false,而不是产生错误...
2021-05-12 22:33:41
if (callback && typeof(callback) == "function")

需要注意的是回调(本身)的计算结果为false,如果是undefinednull0,或false比较null过于具体。

@Joe,但由于短路,如果回调评估为 false,则不会执行该测试。
2021-04-19 22:33:41
此解决方案不起作用,因为第一个条件会立即引发异常。这可能适用于对象的属性: if (obj.callback){...}
2021-05-05 22:33:41
另请注意,如果callback它本身的计算结果为“false-y”值,则其 typeof永远不会是“函数”。
2021-05-10 22:33:41

如果变量未定义,那些判断函数是否已实现的方法也会失败,因此我们使用了支持接收字符串的更强大的方法:

function isFunctionDefined(functionName) {
    if(eval("typeof(" + functionName + ") == typeof(Function)")) {
        return true;
    }
}

if (isFunctionDefined('myFunction')) {
    myFunction(foo);
}
我认为是一个很好的答案,你是对的,上面所有的方法都失败了是函数没有定义。
2021-04-22 22:33:41
避免未定义的引用是微不足道的 - 只需引用typeof window.doesthisexist而不是doesthisexist. 但是,如图所示使用 eval (which: is evil) 仅适用于命名函数 - 这不适用于问题中的用例。
2021-05-04 22:33:41
请注意,这仅适用于全局范围,而公认的答案也适用于局部范围函数。
2021-05-08 22:33:41

尝试:

if (typeof(callback) == 'function')
嗨,不要使用“松散”比较 (==) 始终使用 '===' 来比较甚至变量的类型。
2021-05-09 22:33:41