JavaScript · 主观题 · 第 18 题
前端与全栈开发面试 · 第 18 题
说说浏览器的事件循环,宏任务和微任务分别有哪些?
参考答案
1. JS 主线程只有一个调用栈,同步代码执行完后,由事件循环从任务队列取任务执行。
2. 宏任务(task):script 整体代码、setTimeout / setInterval、用户交互事件、MessageChannel、网络与 IO 回调等。
3. 微任务(microtask):Promise.then / catch / finally、queueMicrotask、MutationObserver;await 之后的代码也是作为微任务继续执行的。
4. 一轮循环:取一个宏任务执行 → 清空所有微任务(执行过程中新加入的微任务也会在这一轮执行完)→ 必要时进行渲染(包括 rAF 回调、样式、布局、绘制)→ 进入下一轮。
5. 推论:微任务比 setTimeout 先执行;微任务无限递归会卡死页面;耗时长的任务会推迟渲染,应当拆分(scheduler.yield、setTimeout 分片)或交给 Web Worker。
解析
分类加上「一个宏任务 → 清空微任务 → 渲染」的循环顺序是核心。