关键区别在于任务组织方式、微任务执行时机及是否存在渲染环节:浏览器采用宏/微任务两级队列并含渲染步骤;node.js基于libuv六阶段轮转,微任务分process.nexttick与promise两级,且无渲染。

区分浏览器和 Node.js 的事件循环,关键不是记概念,而是抓住三个实际可观察的差异点:任务组织方式、微任务执行时机、有没有渲染环节。
任务组织方式不同
浏览器只分宏任务和微任务两层队列,每轮循环固定走“一个宏任务 → 清空所有微任务 → 渲染 → 下一个宏任务”。Node.js 则按 libuv 划分六个阶段:timers → pending callbacks → poll → check → close callbacks。每个阶段只处理自己队列里的回调,比如 setImmediate 一定在 poll 阶段之后、close 之前执行,而 setTimeout(0) 属于 timers 阶段,但可能被 poll 阶段中大量 I/O 延迟执行。
微任务优先级和执行时机不同
浏览器中所有微任务(Promise.then、queueMicrotask)在宏任务结束后统一清空,顺序执行,没有细分优先级。Node.js 有两级微任务:process.nextTick 优先级最高,每次阶段结束时先执行它;然后才是 Promise.then 等普通微任务。这意味着同一段代码,在 Node 中 nextTick 总比 Promise.then 先输出,而浏览器里没有 nextTick 这个机制。
有没有渲染环节决定行为边界
浏览器事件循环明确包含“渲染”步骤——微任务清空后,若 DOM 有变化,会触发重绘或回流。这就意味着长时间运行的 JS 会阻塞页面更新。Node.js 没有 UI,也就没有渲染阶段,它的事件循环纯粹为 I/O 调度服务,poll 阶段会主动等待或处理 I/O 完成事件,更适合高并发服务器场景。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











