当前位置: 首页 > news >正文

前端事件循环:代码世界的“排队”艺术!


🔥 以龙息淬炼代码,在时光灰烬中重铸技术星河 !

欢迎来到 晷龙烬的博客小窝✨!
这里记录技术学习点滴,分享实用技巧,偶尔聊聊奇思妙想~

原创内容✍️,转载请注明出处~感谢支持❤️!请尊重原创📩!
欢迎在评论区交流🌟!

引言

想象你在食堂打饭:同步任务是立刻能打的菜,异步任务是要等的特色窗口。而 事件循环就是那个维持排队秩序的保安,确保所有人(代码)按规矩吃饭(执行)!但更深入地说,事件循环是 JavaScript 实现异步编程的核心机制,它协调单线程环境下的任务执行,避免阻塞主线程。今天,咱们就掰开揉碎聊聊这事儿,并揭示其底层运作!


一、事件循环是啥?

简单说:JS是单线程的,一次只能干一件事。但网页操作(点击、加载)那么多,咋办?事件循环的妙招就是:

  1. 同步任务立刻执行(比如 console.log("饿!")),它们直接进入主线程的调用栈(Call Stack),按顺序运行。
  2. 异步任务丢进队列:异步任务分为宏任务(Macrotask)和微任务(Microtask),分别进入不同队列。宏任务队列包括 setTimeoutI/O操作 等;微任务队列包括 Promise.th en()MutationObserver 等。
  3. 队列按优先级处理:事件循环不断检查队列,规则是:每执行一个宏任务,必须清空整个微任务队列。微任务像VIP通道,优先级最高,能“插队”宏任务。

💡 关键点:任务分两种队伍,但事件循环有更精细的流程

  • 宏任务队(普通窗口):script整体代码setTimeoutsetIntervalI/O操作。它们由宿主环境(如浏览器)管理。
  • 微任务队(VIP窗口):Promise.th en/catchMutationObserverprocess.ne xtTick(Node.js)。它们由JS引擎直接处理,执行时机更早。
    规则:同步代码 → 清空微任务队 → 执行一个宏任务 → 清空微任务队 → 循环… 这确保微任务优先,避免延迟关键更新。

二、看个真实排队案例

console.log("1. 冲进食堂"); // 同步任务,立刻执行
setTimeout(() => {console.log("4. 最后吃炸鸡"); // 宏任务,进普通队
}, 0);
Promise.resolve().then(() => {console.log("3. 先喝奶茶!"); // 微任务,进VIP队
});
console.log("2. 排队中"); // 同步任务,立刻执行

输出顺序

1. 冲进食堂  
2. 排队中  
3. 先喝奶茶!  
4. 最后吃炸鸡  

为啥?深度解析

  1. 同步任务先执行:主线程调用栈运行所有同步代码,输出1和2。此时微任务和宏任务已入队。
  2. 清空微任务队:事件循环检测微任务队列,发现 Promise.th en(),立即执行输出3。微任务总在同步代码后、宏任务前处理,即使 setTimeout(0) 声称“立刻”也需等待。
  3. 执行一个宏任务:微任务队列空后,事件循环取一个宏任务(这里 setTimeout),输出4。注意:宏任务执行中可能产生新微任务,但会在本轮清空。

🚨 重点:微任务插队能力超强,但需注意性能影响
微任务的高优先级能提升响应速度,但过度使用(如循环创建微任务)会阻塞渲染,导致页面卡顿。浏览器事件循环中,微任务清空后才会进行UI更新。


三、循环流程与核心组件

事件循环不只队列,还涉及多个部分:

  • 调用栈(Call Stack) :执行同步代码的地方,函数调用时入栈,完成时出栈。
  • 任务队列(Task Queue) :分宏任务队列和微任务队列,存储待处理的异步回调。
  • 渲染引擎(浏览器) :在微任务清空后,可能触发UI渲染,如 requestAnimationFrame

完整流程

  1. 主线程执行同步代码(调用栈)。
  2. 清空微任务队列:所有微任务依次执行,新微任务会追加到当前队列尾。
  3. 执行一个宏任务:从宏任务队列取一个任务运行。
  4. 循环回第2步:微任务队列再次清空,然后下一个宏任务,如此反复。

口诀

“同微宏,微宏”

  1. 同(同步代码)
  2. 微(清空微任务)
  3. 宏(执行1个宏任务)
  4. 微(再次清空微任务)→ 回第3步宏,形成循环!

这比简单“同微宏”更准确,因为每轮宏任务后都需检查微任务。


四、注意事项与扩展

事件循环在浏览器和Node.js中略有差异:

  • 浏览器:事件循环与渲染管线耦合。每轮循环可能包括:执行宏任务 → 清空微任务 → UI渲染。频繁微任务会延迟页面更新。
  • Node.js:基于libuv库,有额外队列(如 setImmediate),且 process.ne xtTick 优先级高于普通微任务。
    实际影响:在异步编程中,优先使用 Promise/async await(微任务)而非 setTimeout(宏任务),以提升效率。但避免“微任务地狱”,确保代码可维护。

结语

事件循环就像代码世界的交通指挥系统

  • 同步任务是绿灯直行——立即执行。
  • 微任务是救护车优先——总在宏任务前清空。
  • 宏任务是普通车排队——按序处理,但需让行微任务。
    掌握这套规则,复杂代码顺序再也不会懵圈!更深入理解其组件(调用栈、队列)和平台差异,能写出更高效的异步代码。

动手试试
在浏览器运行文中的例子,调整 setTimeoutPromise 位置。尝试添加嵌套微任务(如 Promise.re solve().then(() => { ... })),观察如何阻塞渲染!


—— 完 ——

✨ 至此结束 ✨

💡 点赞关注,解锁更多技术干货!

我是 晷龙烬
期待与你的下次相遇~
可爱小龙猫


文章转载自:

http://eAmHFFP0.fcftj.cn
http://PfoE8u34.fcftj.cn
http://8bRVy0k5.fcftj.cn
http://OE7WrkQu.fcftj.cn
http://cL3DPyQY.fcftj.cn
http://IZI2ZhYY.fcftj.cn
http://99hb3RSZ.fcftj.cn
http://aPdsuC34.fcftj.cn
http://5DEcWzJ0.fcftj.cn
http://OCpTeET7.fcftj.cn
http://sdCZI0zl.fcftj.cn
http://i4dhegc0.fcftj.cn
http://3aHnZgzY.fcftj.cn
http://yTzeHSJM.fcftj.cn
http://KGIh6K6C.fcftj.cn
http://HT6158Yk.fcftj.cn
http://n2rWIbGo.fcftj.cn
http://wL4KJiZM.fcftj.cn
http://LMwa3CUq.fcftj.cn
http://CNbr3t8E.fcftj.cn
http://mH0v6bgu.fcftj.cn
http://5r8SQdYb.fcftj.cn
http://Kyfbh0mk.fcftj.cn
http://1UpdGyYJ.fcftj.cn
http://syqQvMxE.fcftj.cn
http://rvgDDCBV.fcftj.cn
http://Tu69atbp.fcftj.cn
http://ubgskTCq.fcftj.cn
http://RAQ2xpq7.fcftj.cn
http://ysY11X99.fcftj.cn
http://www.dtcms.com/a/369072.html

相关文章:

  • JP4-7-MyLesson后台前端(一)
  • PPIO上线kimi-k2-0905,编码能力大幅提升
  • UniApp 页面通讯方案全解析:从 API 到状态管理的最佳实践
  • 嵌入式|Linux中打开视频流的两种方式V4l2和opencv
  • VBA 中的 Excel 工作表函数
  • Unix/Linux 平台通过 IP 地址获取接口名的 C++ 实现
  • EXCEL列数据前面补零
  • Big Data Analysis
  • 拿到一组数据在mars3d上渲染报错排查思路
  • 力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
  • 《从报错到运行:STM32G4 工程在 Keil 中的头文件配置与调试实战》
  • Meta AI眼镜Hypernova量产临近,微美全息构筑护城河引领人机交互变革浪潮
  • SQL表一共有几种写入方式
  • Vue3源码reactivity响应式篇之ReactiveEffect类
  • C++中的Reactor和Proactor模型进行系统性解析
  • 调试技巧:Chrome DevTools 与 Node.js Inspector
  • 双碳目标下的24小时分时综合能源系统低碳优化调度:基于 Matlab/YALMIP/CPLEX的方法与仿真
  • 告别 “无效阅读”!2025 开学季超赞科技书单,带孩子解锁 AI、编程新技能
  • 鸿蒙Next的UI国际化与无障碍适老化实践:构建全球包容的数字世界
  • react 全屏页面自适应操作,注意问题
  • 计算机毕设选题:基于Python数据挖掘的高考志愿推荐系统
  • PCL中的特征提取
  • 2025年TOP8最佳GNSS位移监测设备权威推荐榜单
  • 告别研发内耗!这款免费项目管理工具,让团队效率实现 3 倍跃升
  • 【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(3):基于Mapbox GL JS 构建的城市三维可视化系统
  • 图像处理:实现多图点重叠效果
  • 在Kingbase数据库中指定用户模式并查看拥有的数据库模式
  • 【TXT】用 Python 实现超漂亮的 HTML 两栏文本对比工具(支持行内差异高亮)
  • VOGUE二十周年女演员群像封面
  • 使用pytorch创建/训练/推理OCR模型