宏任务(macrotask/task)与微任务(microtask)是事件循环中两类优先级不同的任务队列。宏任务包括 setTimeout/setInterval、I/O、UI 事件、script 主代码块;微任务包括 Promise 回调、queueMicrotask、MutationObserver。
执行顺序规则:
- 执行同步代码(可视为第一个宏任务);
- 调用栈清空后,一次性清空微任务队列(期间新增的微任务也会继续执行);
- 执行下一个宏任务,重复步骤 2;
- 浏览器在两个宏任务之间可能进行页面渲染。
setTimeout(() => console.log('宏任务'));
Promise.resolve().then(() => console.log('微任务'));
// 输出:微任务 → 宏任务
关键差异与易错点:微任务在当前宏任务结束后立即全部执行,优先级高于下一个宏任务,因此连续产生微任务可能阻塞渲染(造成页面卡顿)。追问方向:async/await 中 await 之后的代码属于微任务;Node 的 process.nextTick 先于 Promise 微任务执行。