JavaScript事件循环详解与原理分析
2026-02-18 21:23:36
0浏览
收藏
JavaScript事件循环是其异步非阻塞执行的底层引擎,通过调用栈、宏任务队列与微任务队列的精密协作,决定代码的实际执行时序——同步任务立即运行,Promise.then等微任务在当前宏任务结束后立刻批量执行,而setTimeout等宏任务则需等待整个事件循环轮转;正因如此,哪怕设为0毫秒的定时器也总晚于Promise回调,这种看似反直觉的执行顺序恰恰是理解异步行为、避免UI卡顿、写出高性能代码的关键所在。

JavaScript 中的事件循环(Event Loop)是它实现异步非阻塞执行的核心机制,决定了代码何时执行、按什么顺序执行——尤其是当遇到 setTimeout、Promise、用户点击、网络请求等异步操作时。
调用栈、任务队列和事件循环三者如何协作
JavaScript 是单线程语言,只有一个调用栈(Call Stack)。同步代码立即入栈执行;而异步回调不会立刻运行,而是被交给浏览器或 Node.js 的 Web API(如定时器、fetch)处理。等这些 API 完成后,会把对应的回调函数推入「任务队列」(Task Queue)。事件循环持续监听:只要调用栈为空,就从任务队列中取出一个回调,压入调用栈执行。
- 宏任务(Macrotask):如
setTimeout、setInterval、I/O、UI 渲染,每次事件循环只处理一个 - 微任务(Microtask):如
Promise.then、MutationObserver、queueMicrotask,会在当前宏任务结束后、下一个宏任务开始前,全部清空
为什么 Promise.then 总比 setTimeout 先执行
因为 Promise.then 的回调属于微任务,setTimeout 属于宏任务。即使 setTimeout(fn, 0) 设为 0 毫秒,它也要等当前宏任务(比如整个脚本)执行完、所有微任务跑完之后,才轮到它。
例如:
console.log(1);setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
输出顺序是:1 → 4 → 3 → 2。同步代码(1、4)先执行;接着清空微任务队列(3);最后取下一个宏任务(2)。
实际开发中容易踩的坑
- 误以为
setTimeout(fn, 0)能“立刻”执行,其实它至少要等一轮事件循环 - 在大量
Promise.then链中做耗时计算,会阻塞后续微任务甚至 UI 渲染(微任务不中断) - 用
async/await写逻辑时,await后面的代码会被包装成微任务,不是同步延续
基本上就这些。理解事件循环不是为了背概念,而是能预判异步代码的执行节奏,写出更可靠、响应更快的程序。
今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
CSS首字母样式设置方法
- 上一篇
- CSS首字母样式设置方法
- 下一篇
- FIMO导出HTML参数详解与使用技巧
查看更多
最新文章
-
- 文章 · 前端 | 1分钟前 |
- JavaScript Service Worker打造离线应用
- 140浏览 收藏
-
- 文章 · 前端 | 4分钟前 | html
- 外部CSS添加到HTML的完整流程
- 176浏览 收藏

