在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
参数。可能该参数是可选的,所以如果它没有传递给函数,它就不会尝试调用它。