我试图理解setTimeout执行的方式。
在下面的示例中,我希望看到' Inside setTimeout'作为控制台日志中的第二行。
但是,我总是看到' Inside setTimeout'作为控制台日志中的第三行。
这是我在日志中始终如一地看到的:
First
Last
Inside setTimeout
知道为什么会这样吗?
<script>
console.log('First');
// NOTE: 0 milliseconds.
setTimeout(function() {console.log('Inside setTimeout')}, 0);
console.log('Last');
</script>
答案 0 :(得分:2)
即使超时为0ms,它仍会调度异步调用的函数。 setTimeout
的工作方式是:
稍后,当指定的时间量过去后,浏览器将对任务进行排队以调用该函数,该函数将在处理前面的任务时由事件循环处理。
从不立即调用该函数。那会很混乱;通过始终异步调用它,它是一致的。 (这也是为什么承诺的then
和catch
处理程序总是异步调用的原因,即使承诺已经解决了。)
所有血腥细节都是in the specification。
答案 1 :(得分:0)
使用示例处理setTimeout(function,delayTime): 可以找到更多详细信息here。
function main(){
console.log('A');
setTimeout(
function display(){ console.log('B'); }, 0);
console.log('C');
}
main();
// Output
// A
// C
// B
因此setTimeout(function,delayTime)中的delay参数不代表执行该函数之后的精确时间延迟。它代表最短等待时间,之后在某个时间点执行该功能。
- 从medium
复制PS:Philip Roberts撰写的最佳工作视频example。