javascript的事件循环是如何工作的_异步编程的底层机制是什么

发布时间 - 2025-12-25 00:00:00    点击率:
JavaScript事件循环按“同步→微任务(全清)→宏任务(一个)”三步循环执行;同步代码先运行,随后立即清空所有微任务(如Promise.then),再执行一个宏任务(如setTimeout),以此保证异步顺序。

JavaScript 的事件循环是它实现异步编程的底层调度机制,核心在于“单线程不阻塞”——同步代码优先执行,异步任务交由宿主环境(如浏览器或 Node.js)托管,再按规则分批回调到主线程。

调用栈空了,事件循环才开始干活

JavaScript 引擎执行代码时,所有同步函数都压入调用栈(Call Stack),按顺序执行、弹出。一旦栈变空,事件循环立刻介入:不是马上挑一个异步任务来跑,而是先检查有没有微任务等着处理。

  • 微任务(Microtask)必须全部清空——比如 Promise.then、queueMicrotask、MutationObserver 回调
  • 清完才从宏任务队列(Macrotask Queue)里取一个任务执行(比如 setTimeout 回调、用户点击事件、I/O 完成通知)
  • 执行完这一个宏任务后,再次回到“清空微任务”环节,如此循环

宏任务和微任务的典型来源

两类任务由不同机制产生,优先级也不同:

  • 宏任务:整体 script 脚本、setTimeout/setInterval、DOM 事件(click、input)、fetch 响应、UI 渲染(浏览器特有)
  • 微任务:Promise.then/catch/finally、queueMicrotask()、MutationObserver 回调

注意:process.nextTick 是 Node.js 特有,优先级比 Promise.then 还高,但它不属于标准 Web API。

一次事件循环的完整流程

可以理解为三步固定节奏:

  • 执行当前调用栈中所有同步代码(遇到异步操作,只注册回调,不等待)
  • 立即执行所有已排队的微任务(一个不剩)
  • 执行一个宏任务(仅一个!哪怕队列里有十个 setTimeout,这次也只跑第一个)

然后回到第1步,开启下一轮。这个“同步 → 微任务(全清)→ 宏任务(一个)”的节奏,就是控制异步行为顺序的关键。

为什么这个机制重要?

它直接决定你写的异步代码是否按预期执行。比如下面这段:

console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
console.log('D');

输出一定是 A → D → C → B。因为 C 是微任务,在同步代码(A、D)结束后立刻执行;B 是宏任务,要等下一轮循环才轮到。

不复杂但容易忽略


# javascript  # java  # js  # node.js  # node  # 浏览器  # mac  #   # 异步任务  # 点击事件  # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用PHP工具快速搭建高效网站?  七夕网站制作视频,七夕大促活动怎么报名?  如何在IIS中新建站点并配置端口与物理路径?  nginx修改上传文件大小限制的方法  微信推文制作网站有哪些,怎么做微信推文,急?  如何快速启动建站代理加盟业务?  简单实现jsp分页  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  怎么用AI帮你为初创公司进行市场定位分析?  怎么用AI帮你设计一套个性化的手机App图标?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  javascript日期怎么处理_如何格式化输出  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Java解压缩zip - 解压缩多个文件或文件夹实例  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何用搬瓦工VPS快速搭建个人网站?  Java类加载基本过程详细介绍  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  详解vue.js组件化开发实践  Swift中循环语句中的转移语句 break 和 continue  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何在IIS7中新建站点?详细步骤解析  制作电商网页,电商供应链怎么做?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Python自动化办公教程_ExcelWordPDF批量处理案例  php结合redis实现高并发下的抢购、秒杀功能的实例  微信小程序制作网站有哪些,微信小程序需要做网站吗?  韩国服务器如何优化跨境访问实现高效连接?  Laravel如何配置任务调度?(Cron Job示例)  如何破解联通资金短缺导致的基站建设难题?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何在VPS电脑上快速搭建网站?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  公司网站制作需要多少钱,找人做公司网站需要多少钱?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  html如何与html链接_实现多个HTML页面互相链接【互相】  如何快速生成橙子建站落地页链接?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】