浏览器 Event Loop 中,宏任务 和 微任务 的执行顺序是什么?
执行顺序可以记成一句话:
先跑一个宏任务,再把微任务队列清空,再进行渲染,然后进入下一个宏任务。
简化流程:
- 取出并执行 1 个宏任务(
script、setTimeout、I/O、UI 事件等) - 执行完后,立即把当前所有微任务全部执行完(
Promise.then、queueMicrotask、MutationObserver) - 微任务清空后,浏览器才有机会做一次渲染
- 进入下一轮,继续取下一个宏任务
补充重点:
- 微任务会“插队”到下一个宏任务之前。
- 如果微任务不断自我追加,可能长期阻塞渲染和后续宏任务。