javascript的事件循环是如何工作的_异步编程的底层机制是什么
发布时间 - 2025-12-25 00:00:00 点击率:次JavaScript事件循环按“同步→微任务(全清)→宏任务(一个)”三步循环执行;同步代码先运行,随后立即清空所有微任务(如Promise.then),再执行一个宏任务(如setTimeout),以此保证异步顺序。
JavaScript 的事件循环是它实现异步编程的底层调度机制,核心在于“单线程不阻塞”——同步代码优先执行,异步任务交由宿主环境(如浏览器或 Node.js)托管,再按规则分批回调到主线程。
调用栈空了,事件循环才开始干活
JavaScript 引擎执行代码时,所有同步函数都压入调用栈(Call Stack),按顺序执行、弹出。一旦栈变空,事件循环立刻介入:不是马上挑一个异步任务来跑,而是先检查有没有微任务等着处理。
- 微任务(Microtask)必须全部清空——比如 Promise.then、queueMicro
task、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关闭免打扰模式设置【操作】


task、MutationObserver 回调