请对比 Node.js 与浏览器中事件循环的相同点和不同点,并说明各自的核心机制。
考察说明
考查对事件循环机制的理解,以及跨环境差异的掌握。
回答思路
- 【回答框架 1】事件循环是 JavaScript 运行时处理异步任务的机制,核心是调用栈、任务队列和微任务队列。Node.js 基于 libuv 实现,浏览器由 HTML 规范定义。
- 【回答框架 2】相同点:都遵循单线程模型,使用调用栈执行同步代码,异步任务完成后回调进入队列,待栈空时按优先级处理。微任务(如 Promise.then)优先于宏任务(如 setTimeout)。
- 【回答框架 3】不同点:Node.js 事件循环有六个阶段(timers、pending callbacks、idle/prepare、poll、check、close callbacks),每个阶段有专属队列;浏览器事件循环更简单,宏任务队列和微任务队列,每轮宏任务后清空微任务。
- 【回答框架 4】Node.js 中 process.nextTick 优先级高于微任务,浏览器无此概念;setImmediate 在 check 阶段执行,浏览器无对应。浏览器有渲染更新、用户交互等任务,Node.js 无。
- 【回答框架 5】适用场景:Node.js 适合 I/O 密集型,浏览器适合 UI 交互。理解差异有助于优化异步代码性能。
- 【关键点 1】Node.js 事件循环基于 libuv,有六个阶段;浏览器基于 HTML 规范,宏任务与微任务队列。
- 【关键点 2】微任务(Promise)在两者中都优先于宏任务执行。
- 【关键点 3】process.nextTick 和 setImmediate 是 Node.js 特有,浏览器没有。
- 【关键点 4】浏览器事件循环包含渲染和交互任务,Node.js 没有。
- 【关键点 5】两者都单线程,异步通过队列调度。
- 【易错点 1】不要混淆 process.nextTick 与微任务,其优先级更高。
- 【易错点 2】不要认为 setImmediate 与 setTimeout 顺序固定,受上下文影响。
- 【易错点 3】浏览器中宏任务包括渲染,Node.js 中无此概念。