JavaScript 事件循环机制详解_js事件循环队列
myzbx 2025-09-14 23:25 37 浏览
记录、分享IT相关知识和见闻!
想要了解更多软件相关知识的朋友!
记得右上角添加【关注】,支持一下!
JavaScript 是单线程语言,意味着同一时间只能执行一个任务。为了处理异步操作(如定时器、网络请求、事件监听),JavaScript 依赖事件循环机制协调任务执行。事件循环负责管理调用栈(Call Stack)、任务队列(Task Queue)和微任务队列(Microtask Queue),确保异步任务在适当的时机执行。
核心思想:事件循环不断检查调用栈是否为空,并从任务队列或微任务队列中提取任务执行,从而实现非阻塞的异步处理。
2.事件循环的核心组件
事件循环涉及以下几个关键部分:
2.1调用栈(CallStack)
- 调用栈是一个后进先出(LIFO)的结构,记录当前执行的函数调用。
- JavaScript 引擎按顺序执行栈中的函数,执行完后弹出。
- 示例:
2.2任务队列(TaskQueue/MacrotaskQueue)
- 任务队列存储宏任务(Macrotasks),如:
- setTimeout
- 和 setInterval 回调
- I/O 操作(网络请求、文件读写)
- UI 渲染
- 事件回调(如点击、键盘事件)
- 宏任务按进入队列的顺序执行。
- 示例:
2.3微任务队列(MicrotaskQueue)
- 微任务队列存储微任务(Microtasks),优先级高于宏任务,如:
- Promise
- 的 .then、.catch、.finally 回调
- queueMicrotask
- 任务
- MutationObserver
- 回调
- 微任务在当前宏任务执行完成后、渲染前立即执行。
- 示例:
2.4WebAPIs和运行时环境
- JavaScript 运行时(如浏览器或 Node.js)提供 Web APIs 处理异步操作,如 setTimeout、DOM 事件、AJAX 请求。
- 这些 API 在操作完成后将回调推入任务队列或微任务队列。
3.事件循环的工作流程
事件循环是一个不断运行的循环,处理任务的步骤如下:
- 检查调用栈
- 如果调用栈为空,继续后续步骤;否则,执行栈顶函数。
- 处理微任务队列
- 执行微任务队列中的所有任务,直到队列为空。
- 微任务可能在执行过程中添加新的微任务,需全部清空。
- 处理宏任务队列
- 从任务队列中取出一个宏任务,推入调用栈执行。
- 渲染(浏览器环境)
- 如果需要,浏览器执行 UI 渲染(如重绘、重新布局)。
- 重复循环
- 返回第 1 步,持续运行。
可视化流程:
调用栈空 -> 执行所有微任务 -> 执行一个宏任务 -> 渲染(浏览器) -> 重复示例:
解释:
- console.log("Start")
- 入栈,执行,弹出。
- setTimeout
- 注册回调,推入任务队列。
- 两个 Promise.resolve().then 回调推入微任务队列。
- console.log("End")
- 入栈,执行,弹出。
- 调用栈清空,执行微任务队列:输出 Promise 1 和 Promise 2。
- 从任务队列取一个宏任务,输出 Timeout。
4.浏览器vs.Node.js的事件循环
4.1浏览器环境
- 浏览器的事件循环包括宏任务、微任务和渲染阶段。
- 渲染阶段在微任务执行后、下一个宏任务前发生(如更新 DOM)。
- 示例:
4.2Node.js环境
Node.js 的事件循环更为复杂,分为多个阶段,由 libuv 库管理:
- Timers
- :执行 setTimeout 和 setInterval 回调。
- Pending Callbacks
- :处理系统级回调(如 TCP 错误)。
- Idle, Prepare
- :Node.js 内部操作。
- Poll
- :处理 I/O 事件(如文件、网络请求)。
- Check
- :执行 setImmediate 回调。
- Close Callbacks
- :处理关闭事件(如 socket 关闭)。
- 微任务队列在每个阶段后清空,优先级高于宏任务。
- 示例:
5.常见问题与注意事项
5.1为什么setTimeout(fn,0)不立即执行?
- setTimeout
- 的回调进入宏任务队列,需等待调用栈清空和微任务执行完成。
- 延迟 0 毫秒只是请求尽快执行,但受事件循环调度限制。
5.2微任务优先级高于宏任务
- 微任务在当前宏任务后立即执行,可能导致宏任务延迟。
- 示例:
5.3事件循环与性能
阻塞调用栈:长时间运行的同步代码会阻塞事件循环,延迟异步任务。
过多微任务:微任务队列过长可能导致渲染延迟,影响用户体验。
5.4避免常见陷阱
- 合理使用异步
- :避免在微任务中无限添加任务。
- 监控性能
- :使用 performance.now() 或 DevTools 的 Performance 面板分析事件循环瓶颈。
- Node.js 定时器注意
- :setTimeout 和 setImmediate 的执行顺序可能因上下文而异。
6.实际应用场景
- DOM 事件处理:
异步请求:
动画与渲染:
7.调试与分析工具
- Chrome DevTools
- Performance 面板:记录事件循环、宏任务和微任务的执行时间线。
- Sources 面板:设置断点调试异步代码。
- Node.js:
- 使用 --inspect 结合 DevTools 分析事件循环。
- process.nextTick
- (Node.js 独有,优先于微任务)可用于调试微任务。
JavaScript 的事件循环通过协调调用栈、微任务队列和宏任务队列,实现了单线程环境下的高效异步处理。理解事件循环的机制有助于编写高性能的异步代码,避免阻塞和内存问题。在浏览器和 Node.js 中,事件循环的实现略有不同,但核心原理一致。开发者应注意微任务和宏任务的优先级,合理使用异步 API,并利用调试工具优化代码。
说明: 创作不易,喜欢我的文章,记得添加【关注】哦!再次感谢你的支持!欢迎转载!转载请标注来源【新猿习社】即可,无需授权!
长按【点赞】会有惊喜哦!
~End~
封面和摘要
JavaScript 事件循环机制
相关推荐
- 如何设计一个优秀的电子商务产品详情页
-
加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...
- 怎么在JS中使用Ajax进行异步请求?
-
大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
-
前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...
- 前端监控 SDK 开发分享_前端监控系统 开源
-
一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...
- Ajax 会被 fetch 取代吗?Axios 怎么办?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...
- 前端面试题《AJAX》_前端面试ajax考点汇总
-
1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...
- Ajax 详细介绍_ajax
-
1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
-
dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
-
接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
-
时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...
- 2021年超详细的java学习路线总结—纯干货分享
-
本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
-
Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
-
作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...
- 最贱超级英雄《死侍》来了!_死侍超燃
-
死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
-
一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
