为何setTimeout传入finish与finish()会导致执行时机不同?
问题
在以下代码中,“Blast Off!”会在数字1输出1秒后显示。但如果将setTimeout的调用改为setTimeout(finish(), 1000),“Blast Off!”会在数字1输出后立即显示。为何添加()会改变执行时机?希望理解setTimeout(finish, 1000)与setTimeout(finish(), 1000)的区别。
let countDown= time => { let timer = setInterval(function(){ console.log(time); time--; if (time==0){ clearInterval(timer); let finish = ()=> { console.log("Blast Off!"); } setTimeout(finish, 1000); } }, 1000); }; let startNum = Number(prompt("What number should I start counting down from? ")); countDown(startNum);
解答
核心差异其实是函数引用和函数执行的本质区别:
setTimeout(finish, 1000):传递函数本身
这里你给setTimeout传入的是finish函数的引用(可以理解为函数的“地址”),setTimeout会暂存这个引用,等待1000毫秒后,才调用这个函数。所以“Blast Off!”会延迟1秒输出。setTimeout(finish(), 1000):传递函数执行的结果
这里的finish()是立即执行的——代码运行到这一行时,会马上调用finish函数,直接输出“Blast Off!”。由于finish函数没有返回值(默认返回undefined),相当于给setTimeout传递了undefined作为回调参数。setTimeout接收到无效的回调时,不会执行任何延迟操作,因此“Blast Off!”会立刻显示。
一句话总结:带()是现在就执行函数,不带()是告诉定时器“等指定时间到了再执行这个函数”。
内容的提问来源于stack exchange,提问作者mjf1412
相关产品推荐
相关产品推荐

