前端面试题

JavaScript事件循环机制详解

"请讲一下JavaScript的事件循环机制。"

为什么面试官会问这道题

事件循环是JavaScript异步编程的核心机制,也是前端面试出现频率最高的题目之一。字节、腾讯、阿里等大厂经常通过代码输出题考察候选人对事件循环的理解,答不上来基本就凉了。

如何回答

  1. 1

    先明确JS是单线程的——只有一个调用栈,同一时间只能执行一段代码。

  2. 2

    解释事件循环流程:执行同步代码(清空调用栈)→ 清空微任务队列(Promise.then、MutationObserver、queueMicrotask)→ 执行一个宏任务(setTimeout、setInterval、I/O、UI渲染)→ 循环。

  3. 3

    强调微任务优先级:每个宏任务执行完后,必须先清空所有微任务(包括微任务中新产生的微任务),才能执行下一个宏任务。

  4. 4

    区分宏任务队列和微任务队列的概念和包含的API。

  5. 5

    讲async/await的本质:async函数返回Promise,await后面的代码相当于.then()中的回调,进入微任务队列。

参考回答示例

JavaScript是单线程语言,只有一个主线程和一个调用栈。事件循环(Event Loop)是实现异步非阻塞的关键机制。执行过程如下:首先执行全局同步代码,遇到异步任务(如setTimeout、fetch)时将其交给浏览器的Web API处理,完成后将回调推入对应的任务队列。任务队列分两种:微任务队列(Microtask Queue)包含Promise.then/catch/finally、MutationObserver、queueMicrotask;宏任务队列(Macrotask Queue)包含setTimeout、setInterval、setImmediate(Node)、I/O回调、UI渲染事件。事件循环的核心规则是:调用栈清空后,先把微任务队列中的所有任务依次执行完(如果执行微任务过程中又产生了新的微任务,也在本轮一并执行),然后才从宏任务队列中取一个任务执行。执行完一个宏任务后,又会先清空微任务队列,如此循环。举例:console.log(1); setTimeout(()=>console.log(2), 0); Promise.resolve().then(()=>console.log(3)); console.log(4); 输出顺序是1、4、3、2。因为1和4是同步代码先执行,Promise.then是微任务优先于setTimeout宏任务执行。async/await方面,async函数中await之前的代码同步执行,await后面的表达式会立即求值,但await之后的代码相当于放入.then()回调,变成微任务。注意Promise构造函数中的代码是同步执行的,只有.then里的回调才是微任务。在Node.js中还有process.nextTick,优先级比Promise.then更高,属于微任务但在微任务队列最前面执行。

实用技巧

  • 准备好手写代码输出题——这是事件循环最常见的考察方式,面试官会给你一段混合sync/Promise/setTimeout的代码让你说输出顺序。

  • 记住:Promise构造函数是同步执行的,.then才是微任务,很多人搞混。

  • async函数中await前的代码是同步的,这个细节经常被忽略。

  • 面试中如果遇到复杂的执行顺序题,即答侠可以帮你实时分析输出。

常见问题

微任务和宏任务有哪些?

微任务:Promise.then/catch/finally、MutationObserver、queueMicrotask、process.nextTick(Node)。宏任务:setTimeout、setInterval、setImmediate(Node)、I/O、UI渲染、requestAnimationFrame。

requestAnimationFrame是宏任务吗?

严格说rAF既不是宏任务也不是微任务,它在渲染流水线的特定阶段执行——在微任务之后、浏览器绘制之前。每帧只执行一次。

Node.js的事件循环和浏览器有什么区别?

Node.js基于libuv,事件循环分为6个阶段:timers、pending callbacks、idle/prepare、poll、check、close callbacks。有process.nextTick(优先于所有微任务)和setImmediate(check阶段)。浏览器则没有这些阶段划分。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠