【发布时间】:2022-11-10 00:40:14
【问题描述】:
我怎么能说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么setTimeout 中的函数调用不需要括号,但最后一行需要?
【问题讨论】:
标签: javascript
我怎么能说:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
为什么setTimeout 中的函数调用不需要括号,但最后一行需要?
【问题讨论】:
标签: javascript
简而言之
myFunction 引用函数myFunction()调用函数
更多的话
setTimeout 需要函数引用*作为论据。
在某些情况下 setTimeout(myFunction(), 1000) 可能有意义,比如 myFunction() 返回一个函数,例如
function myFunction() {
return function() {
alert("ohai")
}
}
// Or
const myFunction = () => () => alert("ohai")
所以:
setTimeout(myFunction(), 1000);
setTimeout获取myFunction的返回值myFunction 返回一个函数(调用alert)
意味着每秒都会有一个警报。
另见Why function statement requires a name?
*或要评估的字符串,但首选引用。
【讨论】:
myFunction 是一个函数
myFunction() 调用函数并产生函数返回的任何值。
setTimeout 的目的是在一段时间后运行代码。您只需要将函数传递给它(这样 setTimeout 本身就可以在适当的时候调用该函数),因为如果您在将函数传递给 setTimeout 之前调用了函数(带括号),它将执行现在而不是 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 秒后运行。
【讨论】: