新闻中心

J*aScript事件循环_微任务与宏任务解析

2025-11-24
浏览次数:
返回列表
宏任务先执行,微任务在宏任务后立即清空队列,async/await中await后续代码作为微任务执行,setTimeout属于宏任务延后执行。

javascript事件循环_微任务与宏任务解析

J*aScript 是单线程语言,通过事件循环(Event Loop)实现异步操作的管理。理解微任务与宏任务的执行机制,是掌握 JS 异步编程的关键。

宏任务与微任务的基本概念

宏任务(Macrotask):每次事件循环中执行的一个完整任务单元,比如 script 全局代码、setTimeout、setInterval、I/O、UI 渲染等。

微任务(Microtask):在当前任务结束后、下一轮事件循环开始前立即执行的任务,比如 Promise.then、MutationObserver、queueMicrotask 等。

事件循环的流程是:执行一个宏任务 → 执行所有可执行的微任务 → 进入下一个宏任务。

执行顺序:微任务优先于下一个宏任务

每当一个宏任务执行完毕,JS 引擎会清空当前所有的微任务队列,再进入下一个宏任务。

这意味着即使微任务是在宏任务中间创建的,也会在该宏任务结束后立刻执行。

例如:

console.log('1');

setTimeout(() => {
  console.log('2');
}, 0);

Promise.resolve().then(() => {
  console.log('3');
});

console.log('4');

输出顺序为:1 → 4 → 3 → 2

  • 全局 script 是第一个宏任务
  • 同步代码先输出 1 和 4
  • Promise 的 then 回调进入微任务队列,宏任务结束后执行,输出 3
  • setTimeout 属于宏任务,进入下一轮事件循环,最后输出 2

async/await 与微任务的关系

async 函数中的 await 后续代码会被包装成微任务。

Avatar AI Avatar AI

AI成像模型,可以从你的照片中生成逼真的4K头像

Avatar AI 92 查看详情 Avatar AI

看这个例子:

async function async1() {
  console.log('async1 start');
  await async2();
  console.log('async1 end');
}

async function async2() {
  console.log('async2');
}

console.log('script start');
async1();
console.log('script end');

输出为:script start → async1 start → async2 → script end → async1 end

  • async1 执行输出 'async1 start'
  • await 调用 async2,其内部同步代码执行,输出 'async2'
  • await 后面的代码被包装成微任务,所以 'async1 end' 在当前宏任务结束后才执行

常见误区与注意事项

很多人误以为 setTimeout(fn, 0) 会立即执行,实际上它只是将回调加入下一个宏任务队列,必须等待当前所有微任务完成。

任务执行时机非常“紧迫”,适合用于需要尽快响应的操作,如 Promise 链式调用、状态变更通知等。

避免在微任务中无限递归,比如连续调用 queueMicrotask,可能导致主线程阻塞,无法进行 UI 渲染或其他异步操作。

基本上就这些。搞清楚宏任务和微任务的层级关系,就能准确预测 JS 代码的执行顺序。不复杂但容易忽略细节。

以上就是J*aScript事件循环_微任务与宏任务解析的详细内容,更多请关注其它相关文章!


# 下一轮  # 宁河区如何营销推广  # 专注网站建设价钱  # 只做sem不做seo  # 厦门网站建设磐石网络  # 大同市营销推广哪个靠谱  # 湖北官网seo排名  # 视野seo推广  # 西宁市网站建设及推广  # seo我爱自学  # 网站制作及优化报价模板  # 第一个  # 是在  # 微任务宏任务  # 清空  # 源代码  # 回调  # 链式  # 结束后  # 是怎样  # 递归  # ai  # mac  # js  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 一加 14R 快充无反应_一加 14R 充电优化  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  Eclipse怎么运行工程_Eclipse工程运行配置说明  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  快手极速版在线观看 官方网页版登录地址  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  将HTML动态表格多行数据保存到Google Sheet的教程  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  将HTML Canvas内容转换为可上传的图像文件(File对象)  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  菜鸟取件码是什么怎么查 最全查询渠道汇总  动漫花园资源网使用步骤_动漫花园资源网下载流程  Node.js中HTML按钮与J*aScript函数交互的正确姿势  AO3最新官网入口公告_2025AO3镜像站实时查询方法  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  Golang如何使用net/url解析URL_Golang URL解析与处理方法  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  cad如何更改注释性对象的比例_cad注释性比例调整方法  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换  如何将HTML表格多行数据保存到Google Sheet  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  多闪网页版在线观看免费入口_多闪官网访问入口  星露谷物语官网入口 星露谷物语游戏官网入口  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  Win10双系统截图高效法 截屏快捷键速记【技巧】  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  J*aScript中高效管理与清空动态列表:避免循环陷阱  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  妖精动漫免费平台 妖精动漫官网资源观看网址  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  Python字典中优雅地迭代剩余元素的方法  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  小米14应用无法联网原因分析_小米14网络权限修复  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏 

搜索