简单来说浏览器主要执行循序:
1. 所有同步脚本 -> 2. microtask queue微队列里所有事件 -> 3. macrotask queue宏队列队首事件 -> 1...
备注:在步骤2或3中产生的microtask微任务会继续加入到microtask queue微队列的队尾。
那什么是microtask,什么是macrotask呢?
microtask:
- Promise
- process.nextTick (Node独有)
- Object.observe
- MutationObserver
macrotask:
- setTimeout
- setInterval
- setImmediate (Node独有)
- requestAnimationFrame (浏览器独有)
- I/O
- UI rendering (浏览器独有)
举个例子:
setTimeout(() => {
console.log(3)
Promise.resolve().then(() => {
console.log(2)
});
});
console.log(1);
new Promise((resolve, reject) => {
console.log(4)
resolve(5)
}).then((data) => {
console.log(data);
})
setTimeout(() => {
console.log(6);
})
console.log(7);
请在评论里留下你的答案吧~