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

在JavaScript的if语句中使用不带括号的函数名做什么?,javascript,if-statement,function-call,Javascript,If Statement,Function Call,例如: function foo (parameter1, parameter2) { // does something } if (foo) { foo(parameter1, parameter2); } 调用不带括号的函数是在另一个问题()中讨论的,但我仍然不理解上面的代码是做什么的 我问这个问题是因为我试图理解如果(拖动){..}在这段代码中做了什么:这段代码只需检查~~一个名为foo的函数是否存在~~,因此可以安全地调用~~ 另一方面,如果执行if(foo()),

例如:

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

if (foo) {
    foo(parameter1, parameter2);
}
调用不带括号的函数是在另一个问题()中讨论的,但我仍然不理解上面的代码是做什么的


我问这个问题是因为我试图理解
如果(拖动){..}
在这段代码中做了什么:

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


另一方面,如果执行if
(foo())
,则if块中的代码仅在foo()返回与
true

相等的值时才会执行。您的代码定义了一个带有两个参数的全局函数foo

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

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

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

就其本身而言,还不清楚这段代码应该如何有帮助。也许有了更多的背景,事情就会清楚了

考虑以下选项:

1。函数
foo
从未定义:

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

if (foo) {
    foo(parameter1, parameter2);
}
如果未声明
foo
,则:

if(foo) {} 
是一个引用错误。它崩溃了

2。虽然定义了Foo,但它不是一个函数

foo
可以是任何东西,因此如果您有如下的
foo

let foo = true
if(foo) {
   foo()
}
这是一个错误,因为您试图调用的东西不是函数

那么这段代码到底要测试什么呢?如果名称
foo
已声明且等于某个错误值,如
0
未定义
,则它不会调用该函数,但在其他情况下,它会崩溃。它看起来是在试图保护您不受错误的影响,但实际上并非如此,除非在其他上下文中声明了名称,但名称可能未定义

在函数中,
foo
是一个参数,可以保证声明
foo
的公共上下文。该代码在以下示例中更有意义:

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

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

如果(foo存在)调用foo(),当函数对象存在并被定义为某个函数时,它是一个真实值,将作为if条件的正值。如果函数不存在,它会抛出一个未捕获的引用错误。为什么不试试看呢?这不是一个好主意。它只测试
foo
是否存在并且是否真实
foo
仍然可以是任何东西,如果它不是一个函数,它将抛出并出错。另外,如果根本没有定义
foo
,则这是一个引用错误。安全调用可能是一种夸张。这只是测试
foo
是否真实,而不是它是否是一个函数。在我看来,OP实际上问的是这个
if
语句的目的是什么。如果未定义函数,则该
If
语句将抛出与立即调用该函数相同的
ReferenceError
。因此,如果目的不是检查函数是否存在,那会是什么?浏览器鼠标事件下的代码在鼠标移动时调用
drag(deltaX,deltaY){…}
函数,因此事件中传递的唯一参数,所以我不确定作者为什么这样做this@HGent在该准则的背景下,它看起来像是简单的防御性编程
addMouseHandler
是一个函数,它接受一个
drag
参数。可能该参数是可选的,所以如果它没有传递给函数,它就不会尝试调用它。