新闻中心

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

2025-11-22
浏览次数:
返回列表
J*aScript通过事件循环实现异步,宏任务(如setTimeout)执行后清空所有微任务(如Promise.then),再进入下一宏任务,确保微任务优先于渲染执行。

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

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

事件循环的基本流程

J*aScript 引擎在执行代码时,会先运行同步代码,遇到异步任务则将其交给浏览器或 Node.js 环境处理,并注册回调函数。当异步操作完成,回调会被放入任务队列。事件循环不断检查调用栈是否为空,一旦空了,就从任务队列中取出下一个任务执行。

关键点在于:事件循环每次从宏任务队列中取一个任务执行,执行完后,立即清空当前所有的微任务队列,然后再回到宏任务队列取下一个任务。

宏任务(MacroTask)有哪些?

宏任务是事件循环中一次完整的执行单元。每个宏任务执行完毕后,浏览器可以进行渲染更新。

  • setTimeout 回调
  • setInterval 回调
  • I/O 操作
  • UI 渲染
  • script 标签整体代码(初始同步代码也被视为一个宏任务)

微任务(MicroTask)有哪些?

微任务在当前宏任务执行结束后立即执行,且会全部执行完才继续下一个宏任务。

  • Promise.then/catch/finally 回调
  • MutationObserver(DOM 变化监听)
  • queueMicrotask() API
  • process.nextTick()(Node.js 环境,优先级更高)

执行顺序:宏任务 vs 微任务

来看一个经典例子:

console.log('1');

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

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

console.log('4');

输出结果是:1 → 4 → 3 → 2

解释:

  • 先执行同步代码:'1' 和 '4'
  • 遇到 setTimeout,放入宏任务队列
  • 遇到 Promise.then,放入微任务队列
  • 当前宏任务结束,检查微任务队列,执行 then 回调输出 '3'
  • 进入下一轮事件循环,执行 setTimeout 回调输出 '2'

再看一个复杂一点的例子:

Avatar AI Avatar AI

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

Avatar AI 92 查看详情 Avatar AI
console.log('start');

setTimeout(() => {
  console.log('timeout1');
  Promise.resolve().then(() => {
    console.log('promise in timeout');
  });
}, 0);

Promise.resolve().then(() => {
  console.log('promise1');
  setTimeout(() => {
    console.log('timeout in promise');
  }, 0);
});

console.log('end');

输出顺序:start → end → promise1 → timeout1 → promise in timeout → timeout in promise

分析:

  • 同步代码输出 start、end
  • 微任务:第一个 Promise.then 输出 promise1
  • 宏任务队列:第一个 setTimeout 触发,输出 timeout1
  • 此时该宏任务内部产生微任务:Promise.then 输出 promise in timeout
  • 下一轮宏任务:setTimeout 在 promise 中注册的那个触发

注意:微任务总是在当前宏任务末尾被集中执行,即使它是在 setTimeout 回调中创建的。

常见误区与注意事项

很多人误以为 setTimeout(..., 0) 就是“立刻执行”,其实它只是尽快加入宏任务队列,必须等当前所有同步和微任务完成。

微任务的高优先级意味着滥用 Promise.then 做大量计算可能阻塞渲染,因为浏览器只在宏任务之间重绘页面。

在实际开发中,若想让某些操作延迟到当前所有异步回调之后执行,可以用 queueMicrotask 或 Promise.resolve().then() 包裹。

基本上就这些。搞清楚宏任务和微任务的执行时机,就能准确预测异步代码的输出顺序。不复杂但容易忽略细节。

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


# 第一个  # 食品网站建设美丽  # 地区性关键词排名软件  # 信誉好的网络营销推广  # 丰都网站优化推广  # 优化网站哪里下载  # 咸阳营销型网站建设效果  # 品牌营销数据推广  # 酒店年会推广营销话术模板  # 三门峡广告营销推广公司  # 舟山公司网站建设费用  # 下一轮  # 按需  # 清空  # 如何用  # 管理器  # javascript  # 有哪些  # 是在  # 如何使用  # 回调  # 重绘  # 异步任务  #   # mac  # 回调函数  # 浏览器  # node  # node.js  # js  # java 


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


相关推荐: 12306选座怎么选到临时改签座_12306改签选座策略与步骤  J*aScript实现单选按钮与关联输入框的联动禁用教程  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  响应式图片在网页设计中的正确实现方法  React/Next.js中实现列表项的动态选择与移动  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  创客贴用户入口官网登录 创客贴网页版电脑版系统  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  AO3同人作品网入口 AO3搜索引擎官网永久地址  SteamMachine定价或为699美元 大家想入手吗?  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  Python字典中优雅地迭代剩余元素的方法  Python getattr() 异常处理深度解析:避免程序意外退出  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  J*a应用集成GitHub CLI与API认证指南  c++如何使用Meson构建系统_c++比CMake更快的构建工具  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  如何在 Windows 11 中启动游戏手柄设置  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  excel如何生成目录 excel一键生成工作表目录超链接  J*a应用程序首次运行自动创建文件与目录的最佳实践  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  抖音从哪里进入网页版_抖音官方入口链接  C++如何实现单例模式_C++设计模式之线程安全的单例写法  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  如何使用Node.js csv 包按条件移除含空字段的CSV记录  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  在VS Code中配置和运行Dart程序的完整步骤  微信群消息显示延迟如何解决 微信群消息刷新优化方法  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售 

搜索