我怎么能说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么setTimeout
中的函数调用不需要括号,但最后一行呢?
答案 0 :(得分:17)
setTimeout
函数需要函数引用 * 作为参数:引用是变量,没有括号。
函数调用需要括号(即使该函数不带参数)。
Nutshell: myFunction
是对该函数的引用。 myFunction()
执行函数,并在表达式中“等于”函数的返回值(如果没有返回任何内容,则为undefined
。)
深入研究:在setTimeout(myFunction(), 1000)
可能有意义的情况下,例如myFunction()
本身返回函数。例如:
var myFunction = function() {
return function() {
alert("ohai");
};
};
return
语句)立即执行。alert
。所以:
myFunction
是对函数的引用(恰好返回函数)。myFunction()
将执行。它评估为适用于setTimeout()
的函数引用。最后:
setTimeout(myFunction(), 1000);
这会在一秒钟内调用myFunction()
的返回值。一秒钟之后,警报会弹出。
另见Why function statement requires a name?
*或者要评估的字符串,但首选参考。
答案 1 :(得分:7)
myFunction
是一个函数
myFunction()
调用函数并生成函数返回的任何值。
setTimeout的目的是在经过一段时间后运行代码。你只需要将函数传递给它(因此setTimeout本身可以在适当的时候调用函数),因为如果在将函数传递给setTimeout之前调用函数(带括号),它将执行 now 而不是之后1秒。
答案 2 :(得分:5)
使用括号时,它会说“立即调用此函数”。因此,如果你说setTimeout(myFunction(),1000);
,它将使用函数的返回值作为超时的回调。如果函数的返回值本身不是函数,则会出现错误,因为它会尝试执行超时后不可执行的内容(字符串,数字,未定义等)。
答案 3 :(得分:2)
在第2行中,函数myFunction
未被调用,但作为参数传递给setTimeout
函数,而第4行调用myFunction
;要调用函数,即使没有参数,总是必须使用括号。
答案 4 :(得分:1)
我认为,如果可以的话,这个示例将使其更清楚
function callback() {
console.log('this function runs on page loads.');
}
setTimeout(callback(), 2000);
此处callback()
函数将在页面加载后立即运行,而不会等待2秒。
function callback() {
console.log('this function runs after page loads.');
}
setTimeout(callback, 2000);
此处callback()
功能将在2秒钟后运行。