JavaScript引擎不实现事件循环,而是由宿主环境提供调度机制;引擎负责执行代码、管理调用栈与任务队列逻辑,调用栈清空后才处理异步回调,宏任务与微任务分属不同队列且微任务优先级更高,Web API作为异步中转站将回调推入对应队列,事件循环依赖宿主环境而非引擎自身。

JavaScript 引擎本身不直接“实现”事件循环,而是与宿主环境(比如浏览器或 Node.js)协同工作——引擎负责执行代码、管理调用栈和任务队列逻辑,而事件循环的调度机制由宿主环境提供。
调用栈是同步执行的唯一通道
所有函数调用都压入调用栈,遵循后进先出原则。JS 引擎只在栈为空时,才腾出手来处理异步回调。这意味着:同步代码永远优先,任何异步操作(哪怕 setTimeout(fn, 0))都得等当前栈彻底清空。
宏任务和微任务由不同队列承载
宿主环境维护两套独立队列:
-
宏任务队列:含整体 script、
setTimeout、setInterval、I/O 回调、UI 渲染等;每次只取一个执行 -
微任务队列:含
Promise.then/catch/finally、MutationObserver、queueMicrotask;每次宏任务结束后,必须全部清空
这个优先级差异直接影响输出顺序。例如同步日志 → 微任务日志 → 下一个宏任务日志,不是靠“时间”决定,而是靠队列层级。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
Web API 是异步任务的中转站
当遇到 fetch 或 setTimeout,JS 引擎会把回调交给浏览器的 Web API 模块(如定时器线程、网络线程)。这些线程独立运行,完成后将回调推入对应的任务队列——JS 引擎并不参与这部分耗时操作,只负责后续调度执行。
事件循环不是 JS 引擎的独立模块
V8(Chrome)、SpiderMonkey(Firefox)等引擎核心关注语法解析、JIT 编译、内存管理与执行上下文。它们暴露接口(如 EnqueueJob)让宿主环境插入微任务,也依赖宿主提供 RunMicrotasks 和宏任务轮询逻辑。换句话说:引擎定义“怎么跑”,宿主决定“什么时候跑、跑哪个”。

















