console.log(1);
setTimeout(function() {
console.log(2);
}, 0);
new Promise(function(resolve) {
console.log(3);
resolve(Date.now());
}).then(function() {
console.log(4);
});
console.log(5);
setTimeout(function() {
new Promise(function(resolve) {
console.log(6);
resolve(Date.now());
}).then(function() {
console.log(7);
});
}, 0);
1.执行 log(1),输出 1;
2.遇到 setTimeout,将回调的代码 log(2)添加到宏任务中等待执行;
3.执行 console.log(3),将 then 中的 log(4)添加到微任务中;
4.执行 log(5),输出 5;
5.遇到 setTimeout,将回调的代码 log(6, 7)添加到宏任务中;
6.宏任务的一个任务执行完毕,查看微任务队列中是否存在任务,存在一个微任务 log(4)(在步骤 3 中添加的),执行输出 4;
7.取出下一个宏任务 log(2)执行,输出 2;
8.宏任务的一个任务执行完毕,查看微任务队列中是否存在任务,不存在;
9.取出下一个宏任务执行,执行 log(6),将 then 中的 log(7)添加到微任务中;
10.宏任务执行完毕,存在一个微任务 log(7)(在步骤 9 中添加的),执行输出 7;
参考链接:前端中的事件循环eventloop机制
这次,十分钟把宏任务和微任务讲清楚
这一次,彻底弄懂 JavaScript 执行机制
原文:https://www.cnblogs.com/yangAL/p/14386344.html