js事件机制问题:以下代码分别打印顺序是什么?

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end')

按照我的理解先执行宏任务,再执行清空微任务队列,再执行下一个宏任务。
所以应该是

script start
setTimeout
script end
promise1
promise2

但是输出的结果是:

script start
VM106:13 script end
VM106:8 promise1
VM106:10 promise2
VM106:4 setTimeout

为什么setTimeout在最后打印出来的?

阅读 2.3k
2 个回答

先执行宏任务,再执行清空微任务队列,再执行下一个宏任务.

第一个宏任务队列中只有一个任务:执行主线程上的JS代码.

把整个代码段看作第一个宏任务(执行所有同步任务,包括new Promise()里的):

console.log('script start');
console.log('script end')

再清空微任务队列(promise.then MutationObserver):

console.log('promise1');
console.log('promise2');

下一个宏任务(setTimeout setInterval requestAnimationFrame):

console.log('setTimeout');
推荐问题
宣传栏