[英]Why does SetTimeout code still executes after clearTimeout
[英]Why does a setTimeout delay of 0 still run after all other synchronous code in a for loop?
我知道已经讨论过该问题的版本,并且我认为这是独一无二的。 为什么的0延迟,还是引起以下行为。
for(var i = 0; i <3; i ++) {
console.log(i, 'started');
setTimeout(()=> {
console.log(i);
},0)
console.log(i, 'done');
}
console.log('loop over');
// 0 started
// 0 done
// 1 started
// 1 done
// 2 started
// 2 done
// loop over
// 3 3 3
以下是我认为我目前所知:
从MDN在相对于所述堆叠上下一个定时器,位置引述:
这是因为即使setTimeout的延迟为零,它也被放置在队列中并计划在下一个机会运行。 不是立即。 当前执行的代码必须在执行队列中的功能之前完成,因此生成的执行顺序可能与预期的不同。
我在说的for循环和任何同步代码放在调用堆栈上的setTimeout 之前 ,即使你的延迟设置为0,将setTimeout的for循环完成后才能始终运行是否正确? 否则,为什么会的0延迟,仍然导致上述行为?
谢谢!
编辑:
在朝着正确的方向开始之后,我发现了一些视频和一个不错的小工具,向您展示了事件循环及其与示例代码的关系。 这是JS运行时模拟器: 放大镜
浏览器和服务器上的JavaScript均作为事件循环运行。 运行时会不断轮询事件。 事件包括用户操作(例如,单击了DOM元素x),I / O(数据从I / O或ajax调用返回)和计时器事件(在这种情况下)。 setTimeout(fn, 0)
仅在至少经过0毫秒时添加事件循环至少要处理的事件。 处理完当前事件后,它将始终执行。
我说的正确是for循环和任何同步代码都在setTimeout之前放入调用堆栈中
令人讨厌的是,setTimeout()本身会被同步调用,并被放置在console.log(i, 'started');
之后的调用堆栈中console.log(i, 'started');
。 settimeout 回调 (在您的情况下为console.log(i)
)被排队并异步调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.