假设我写了一个函数:
function foo() {
alert("Hello, world!");
}
为什么当我尝试在一段时间后调用它时,它会立即被调用?
setTimeout(foo(), 10000);
同样 - 使用事件处理程序?试图这样做:
el.onclick = foo();
el.addEventListener("click", foo());
createButton({
name: "show alert",
onClick: foo(),
});
您可能在函数名称周围写了括号 -
foo()
- 不小心。也许您认为函数与变量的不同之处在于这些括号。无论如何,错误都隐藏在这里。简而言之:删除多余的括号,一切都会奏效。
Javascript 从内到外评估表达式(就像许多其他语言一样)。数学中的明显例子:在表达式
2 + 2 * 2
中,先执行乘法,然后执行加法,在表达式(2 + 2) * 2
中反之亦然。当您编写时
foo()
- 它是一个函数调用运算符。这与任何数学运算都是表达式的相同部分。如果表达式内部的某个地方有一个 callfoo()
,那么foo
无论外面写什么,都会调用该函数。因此,在示例中,
setTimeout(foo(), 10000);
首先调用它foo()
,然后将调用的结果foo()
(通常是 someundefined
)转移到setTimeout
:setTimeout(undefined, 10000)
。从 Javascript 解释器的角度来看,这不是一个错误:他不知道这是什么foo
,他只是乖乖地按照你告诉他的去做。如果您不需要调用函数,则不要调用它。我们只是删除函数名称周围的括号 - 现在它按原样传递,无需调用:
到时候他们会在别处打电话给她。(顺便说一句,在某处传递的这种函数通常称为回调、回调或回调函数)。
如果您想知道解释器将如何区分函数和变量,那么答案是它不需要区分它们,函数名是一种变量名。