在 JavaScript 的 if 语句中使用不带括号的函数名有什么作用?

What does using a function name without parentheses do in an if statement in JavaScript?

例如:

function foo (parameter1, parameter2) {
    // does something
}

if (foo) {
    foo(parameter1, parameter2);
}

在另一个问题(In JavaScript, does it make a difference if I call a function with parentheses?)中谈到了不带括号调用函数,但我仍然不明白上面的代码是做什么的。

我问是因为我想了解 if (drag) {..} 在此代码中的作用:https://andreasrohner.at/posts/Web%20Development/JavaScript/Simple-orbital-camera-controls-for-THREE-js/

这段代码只是检查~~一个函数~~是否存在名为 foo 的东西~~,因此可以安全地调用~~。

另一方面,如果你这样做 if (foo()),if 块中的代码只会在 foo() return 等同于 true.[=13 的情况下执行=]

您的代码定义了一个带有两个参数的全局函数 foo。

之后有一个 if 语句来检查 foo 是否为真(foo 是您的函数,因此为真)。所以它调用函数 foo。 但要小心,如果没有定义 foo,您的代码将抛出 ReferenceError

检查函数是否存在的更好方法是:

if (typeof foo === "function") { 
  // safe to use the function foo
} 

就其本身而言,尚不清楚这段代码应该如何提供帮助。也许有更多的上下文会很清楚。

考虑这些选项:

1.函数 foo 从未定义:

如果未声明 [​​=13=] 则:

if(foo) {} 

是参考错误。它崩溃了。

2。 Foo 已定义,但它不是函数

foo 可以是任何东西,所以如果你的 foo 看起来像这样:

let foo = true
if(foo) {
   foo()
}

这是一个错误,因为您正在尝试调用不是函数的东西。

那么这段代码究竟要测试什么?如果声明了名称 foo 并且等于某些虚假值,如 0undefined,它不会调用该函数,但在其他情况下它会崩溃。它看起来像是在试图保护您免受错误,但实际上并没有,除非在其他上下文中声明了名称但可能未定义。

保证声明 foo 的常见上下文是在函数内部,其中 foo 是一个参数。该代码在以下示例中更有意义:

someFunction(foo){
    if(foo) {
       foo()
    }
}

在这里你可以期望 foo 存在,但你仍然需要相信调用者传递了一个函数。这将防止被调用者不传递参数的情况。 (即调用 someFunction()