【发布时间】:2020-01-09 20:59:03
【问题描述】:
我怎么能说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么setTimeout中的函数调用不需要括号,而最后一行却需要?
【问题讨论】:
标签: javascript
我怎么能说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么setTimeout中的函数调用不需要括号,而最后一行却需要?
【问题讨论】:
标签: javascript
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?
* 或要评估的字符串,但首选引用。
【讨论】:
myFunction 是一个函数
myFunction() 调用函数并产生函数返回的任何值。
setTimeout 的目的是在一段时间后运行代码。您只需将函数传递给它(因此 setTimeout 可以在适当的时候调用该函数),因为如果您在将函数传递给 setTimeout 之前调用该函数(带括号),它将执行 now 而不是之后1 秒。
【讨论】:
当您使用括号时,它表示“立即调用此函数”。所以如果你说setTimeout(myFunction(),1000);,它将使用函数的返回值作为超时回调。如果函数的返回值本身不是一个函数,你会得到一个错误,因为它会尝试在超时后执行一些不可执行的东西(字符串、数字、未定义等)。
【讨论】:
alert("Hello world!");,它将在这种情况下工作,因为setTimeout 可以接受字符串作为 js 代码文字。跨度>
在第 2 行中,函数 myFunction 没有被调用,而是作为参数传递给 setTimeout 函数,而在第 4 行中,myFunction 被调用;要调用函数,您总是必须使用括号,即使没有参数。
【讨论】:
如果可以的话,我认为这个例子会更清楚,
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秒后运行。
【讨论】: