为什么带有0秒的setTimeout最后结束

时间:2018-11-21 04:45:53

标签: javascript asynchronous synchronous

所以我想出了这个例子,我不明白为什么0秒的setTimeout是要执行的最后一个

function waitThreeSeconds() {
  setTimeout(function() {
    console.log("Finished Function");
  }, 0);
}

function clickHandler() {
  console.log("Clicked");
}

document.addEventListener('click', clickHandler);

waitThreeSeconds();

//waiting 5 seconds 
var ms = 5000 + new Date().getTime();
while (new Date() < ms) {}


console.log('Finished Execution');

如果将setTimeouts回调添加到队列中是正确的,为什么每次我执行click事件时,它都会比setTimeout的回调更早添加到队列中。直到全局执行上下文(“ main”)从堆栈中弹出为止

2 个答案:

答案 0 :(得分:0)

是的,@ KenY-N在问题评论中确实如此。

我之前就应允回拨(https://stackoverflow.com/a/40882544/5217142)回答了这个问题:

  
    

用HTML术语来说,来自同一域的一个页面或一组页面的event loop可以有多个task queues。来自同一task source的任务总是进入同一队列,浏览器选择下一步使用哪个任务队列。

         

运行计时器回调的任务来自timer task source,并进入同一队列。...

  

这里的区别是您要询问单击事件的任务队列优先级是否高于计时器回调的优先级。

通过检查,您的代码显示答案是肯定的:单击事件的任务队列优先于您尝试使用的浏览器中的计时器回调任务队列。

答案 1 :(得分:0)

  

由于事件循环,javascript的每个事件都在   执行过程所遵循的堆栈,注册settimeout 0   ,在事件循环执行时将在其中执行   完成休息中的其他任务。

对于裁判,请参见Philip roberts的惊人解释

https://www.youtube.com/watch?v=8aGhZQkoFbQ&vl=en