百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

JavaScript 事件循环机制详解_js事件循环队列

myzbx 2025-09-14 23:25 6 浏览



记录、分享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.事件循环的工作流程

事件循环是一个不断运行的循环,处理任务的步骤如下:

  1. 检查调用栈
  2. 如果调用栈为空,继续后续步骤;否则,执行栈顶函数。
  3. 处理微任务队列
  4. 执行微任务队列中的所有任务,直到队列为空。
  5. 微任务可能在执行过程中添加新的微任务,需全部清空。
  6. 处理宏任务队列
  7. 从任务队列中取出一个宏任务,推入调用栈执行。
  8. 渲染(浏览器环境)
  9. 如果需要,浏览器执行 UI 渲染(如重绘、重新布局)。
  10. 重复循环
  11. 返回第 1 步,持续运行。

可视化流程

调用栈空 -> 执行所有微任务 -> 执行一个宏任务 -> 渲染(浏览器) -> 重复

示例

解释

  1. console.log("Start")
  2. 入栈,执行,弹出。
  3. setTimeout
  4. 注册回调,推入任务队列。
  5. 两个 Promise.resolve().then 回调推入微任务队列。
  6. console.log("End")
  7. 入栈,执行,弹出。
  8. 调用栈清空,执行微任务队列:输出 Promise 1Promise 2
  9. 从任务队列取一个宏任务,输出 Timeout

4.浏览器vs.Node.js的事件循环

4.1浏览器环境

  • 浏览器的事件循环包括宏任务、微任务和渲染阶段。
  • 渲染阶段在微任务执行后、下一个宏任务前发生(如更新 DOM)。
  • 示例:

4.2Node.js环境

Node.js 的事件循环更为复杂,分为多个阶段,由 libuv 库管理:

  1. Timers
  2. :执行 setTimeoutsetInterval 回调。
  3. Pending Callbacks
  4. :处理系统级回调(如 TCP 错误)。
  5. Idle, Prepare
  6. :Node.js 内部操作。
  7. Poll
  8. :处理 I/O 事件(如文件、网络请求)。
  9. Check
  10. :执行 setImmediate 回调。
  11. Close Callbacks
  12. :处理关闭事件(如 socket 关闭)。
  • 微任务队列在每个阶段后清空,优先级高于宏任务。
  • 示例:

5.常见问题与注意事项

5.1为什么setTimeout(fn,0)不立即执行?

  • setTimeout
  • 的回调进入宏任务队列,需等待调用栈清空和微任务执行完成。
  • 延迟 0 毫秒只是请求尽快执行,但受事件循环调度限制。

5.2微任务优先级高于宏任务

  • 微任务在当前宏任务后立即执行,可能导致宏任务延迟。
  • 示例:

5.3事件循环与性能


阻塞调用栈:长时间运行的同步代码会阻塞事件循环,延迟异步任务。

过多微任务:微任务队列过长可能导致渲染延迟,影响用户体验。

5.4避免常见陷阱

  • 合理使用异步
  • :避免在微任务中无限添加任务。
  • 监控性能
  • :使用 performance.now() 或 DevTools 的 Performance 面板分析事件循环瓶颈。
  • Node.js 定时器注意
  • setTimeoutsetImmediate 的执行顺序可能因上下文而异。

6.实际应用场景

  • DOM 事件处理

异步请求

动画与渲染

7.调试与分析工具

  • Chrome DevTools
    • Performance 面板:记录事件循环、宏任务和微任务的执行时间线。
    • Sources 面板:设置断点调试异步代码。
  • Node.js:
    • 使用 --inspect 结合 DevTools 分析事件循环。
    • process.nextTick
    • (Node.js 独有,优先于微任务)可用于调试微任务。

JavaScript 的事件循环通过协调调用栈、微任务队列和宏任务队列,实现了单线程环境下的高效异步处理。理解事件循环的机制有助于编写高性能的异步代码,避免阻塞和内存问题。在浏览器和 Node.js 中,事件循环的实现略有不同,但核心原理一致。开发者应注意微任务和宏任务的优先级,合理使用异步 API,并利用调试工具优化代码。


说明: 创作不易,喜欢我的文章,记得添加【关注】哦!再次感谢你的支持!欢迎转载!转载请标注来源【新猿习社】即可,无需授权!


长按【点赞】会有惊喜哦!

~End~

封面和摘要

JavaScript 事件循环机制

相关推荐

泰国野猪足球队一17岁队员在英去世,曾被困洞穴18天后奇迹获救

泰国网图当地时间2月14日,现年17岁的泰国野猪队队员多姆(Dom,本名DuangpetchPromthep)在英国去世,他曾于2018年被困于洞穴18天后奇迹获救。据英国广播公司(BBC)报道,...

你需要知道的 19 个 console 实用调试技巧

大家好,我是Echa。之前给大家介绍了《H5移动端调试攻略——超实用》,有兴趣的小伙们可以回过头看看。浏览器的开发者工具为我们提供了强大的调试系统,可以用来查看DOM树结构、CSS样式调试、动画调试...

深圳嘉华学校:什么是JQuery?_深圳嘉华职业技术学校

什么是JQuery?这里将由北大青鸟深圳嘉华来介绍下关于JQuery部分知识,希望能让大家对JQuery有初步的映象。JQuery是继prototype之后又一个优秀的Javascript库。它是轻量...

Vue3 实现一个简单的放大动画_vue放大图片

设计思路定位动画我们在之前已经实现了。那么这里只要考虑如何实现放大动画,最后将两者结合起来就好。从后端拿到的返回值是一个固定长度的数组,所以这里还是用div利用flex布局将图片平铺展示,利用...

JavaScript 事件循环机制详解_js事件循环队列

记录、分享IT相关知识和见闻!想要了解更多软件相关知识的朋友!记得右上角添加【关注】,支持一下!JavaScript是单线程语言,意味着同一时间只能执行一个任务。为了处理异步操作(如定时器、网络请求...

前端性能优化新维度:渲染流水线深度解析

当开发者沉迷于框架选型和语法特性时,浏览器渲染引擎正在以每秒60帧的速度执行着精密计算。本文将揭示现代浏览器的渲染流水线工作原理,探索超越传统性能优化的新思路。一、渲染流水线的五大阶段1.JavaSc...

一组动漫人物插画,浓烈的光与影超棒,插画师DOM

...

如果看未来,DOM应该也不是答案_如果知道未来

Managershare:未来,还会有连通APP的APP。不过,一切都不会基于网页。有一个词"手机网站"(mobileweb),指供手机浏览的网站,但它是不存在的。人们提到"移动互联网"的时候,其实...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题):1.登录时的验证码2.自动登录的实现3.怎么维护前后端登录状态在这和大...

总结100+前端优质库,让你成为前端百事通

1年多时间,陆陆续续整理了一些常用且实用的开源项目,方便大家更高效地学习和工作.js相关库js常用工具类「lodash」一个一致性、模块化、高性能的JavaScript实用工具库。「xij...

基于ssm的XATU实验室安全管理系统 [SSM]-计算机毕业设计源码+文档

摘要:实验室安全管理是高校和科研机构工作中的重要环节。本文介绍了基于SSM(Spring+SpringMVC+MyBatis)框架的XATU实验室安全管理系统。该系统涵盖系统用户管理、安全教...

Dynamics.js – 创建逼真的物理动画的 JS 库

Dynamics.js是一个用于创建物理动画JavaScript库。你只需要把dynamics.js引入你的页面,然后就可以激活任何DOM元素的CSS属性动画,也可以结合SVG使...

Vue3 神级工具:终于可以实现打字的动画效果了!

Typed.js是一个轻量级的JavaScript库,用于在网页上实现打字机动画效果。它支持自定义打字速度、循环模式、回调函数等,非常适合用于动态展示标语、代码片段或交互式文本效果。核心特性打字...

创建酷炫动画效果的10个JavaScript库

Dynamics.js是设计基于物理规律的动画的重要JavaScript库。它可以赋予生命给所有包含CSS和SVG属性的DOM(文本对象模型)元素,换句话说,Dynamics.js适用于所有Java...

《速度与激情》动画剧首曝剧照,12月26日奈飞上线

新京报讯11月19日,《速度与激情》动画剧《速度与激情:间谍赛车手》发布首批剧照,并宣布将于12月26日在奈飞上线。该剧由范·迪塞尔担任制片人,他的女儿SimiliceDiesel加盟配音。此外,...