繁体   English   中英

为什么在for循环中的所有其他同步代码之后,仍会运行setTimeout延迟为0的延迟?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM