游乐游手机版
首页/前端开发/文章详情

JavaScript宏任务产生后如何进入任务队列

时间:2026-07-26 06:20
JavaScript宏任务产生后,按先进先出规则排入队列,但必须等待当前执行栈清空且所有微任务执行完毕后才取出执行。常见来源包括setTimeout、setInterval、setImmediate(Node js)、I O回调、UI渲染及MessageChannel回调。每次宏任务执行后,会清空整个微任务队列,二者优先级不同。

首先来探讨宏任务的队列调度机制。在 JavaScript 事件循环中,宏任务遵循先进先出(FIFO)的排队原则,但有一个重要前提:当前执行栈必须完全清空,并且微任务队列也需全部处理完毕,之后才会从宏任务队列中取出下一个任务执行。常见的宏任务来源包括:setTimeout、setInterval、setImmediate(仅 Node.js 环境)、I/O 回调、UI 渲染,以及 MessageChannel 的 onmessage 回调。

Ja vaScript 宏任务产生后怎么排入队列

JavaScript 的宏任务(Macrotask)一旦被创建,事件循环便会将其放入对应的队列中。只有当当前执行栈清空且微任务队列全部执行完毕后,事件循环才会依次从宏任务队列中取出每个任务并执行。

宏任务的常见来源

以下操作都会创建新的宏任务,并加入队列:

  • setTimeout 和 setInterval 的回调函数(即使延时设置为 0,它们也属于宏任务)
  • setImmediate(仅在 Node.js 环境中可用)
  • I/O 操作完成后的回调(例如文件读取、网络请求响应等)
  • UI 渲染(浏览器中的一次渲染帧可视为一个宏任务的边界)
  • MessageChannel 的 port.onmessage 回调(注意:虽然常被用来模拟微任务,但其本质仍是宏任务)

宏任务入队的时机与规则

宏任务并非“立即执行”,而是满足条件后由调度器插入队列:

  • 定时器到期时(例如 setTimeout 达到指定延迟),回调函数被加入宏任务队列(并非立即执行)
  • 异步操作完成(如 fetch 响应、readFile 结束),其 then/catch 回调中的非 Promise 链部分(即外层回调)属于宏任务
  • 宏任务队列遵循先进先出(FIFO)结构,但不同来源可能拥有独立的子队列(例如 Chrome 中 setTimeout 与 I/O 回调可能分属不同队列,但对外表现为统一的调度顺序)
  • 宏任务只有在当前执行栈为空且所有微任务都执行完毕后,才会从队列头部取出一个任务执行

宏任务与微任务的关键区别

宏任务和微任务(例如 Promise.then、queueMicrotask)共同存在于事件循环中,但它们的优先级差异显著:

  • 每次宏任务执行完毕后,事件循环会立即清空整个微任务队列(直到没有新的微任务加入)
  • 宏任务之间必然穿插一次完整的微任务清空过程
  • 微任务不会被新来的宏任务“插队”;新的宏任务只能等待当前宏任务以及所有微任务全部结束后才能执行

简单验证方式

通过嵌套的 setTimeout 和 Promise 即可观察执行顺序:

console.log('1');setTimeout(() => console.log('2'), 0);Promise.resolve().then(() => console.log('3'));console.log('4');// 输出:1 → 4 → 3 → 2

执行顺序非常清晰:同步代码(1 和 4)首先执行;随后是微任务(3);最后才轮到宏任务队列中的 setTimeout 回调(2)。

来源:https://www.php.cn/faq/2796037.html
上一篇CSS Flexbox实现图标与文字垂直居中对齐 下一篇CSS顶部栏纯色背景设置:不受父容器透明度影响
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CSS3入门指南:常用特性解析与实战练习路径
前端开发 · 2026-09-01

CSS3入门指南:常用特性解析与实战练习路径

CSS3是现代网页开发的核心技术,涵盖圆角、阴影、渐变、过渡、动画及响应式布局等高频特性。本文梳理了CSS3的核心应用场景、分步学习路径与综合练习案例,帮助初学者快速建立从基础排版到现代交互的完整开发思路,并规避常见样式陷阱。

CSS border 边框属性详解:语法、拆分写法与常见问题排查
前端开发 · 2026-09-01

CSS border 边框属性详解:语法、拆分写法与常见问题排查

本文系统讲解CSS标准边框属性border的完整语法结构,涵盖简写与拆分写法、单边控制技巧及border-radius配合方案。针对边框不显示、元素尺寸异常等高频问题提供排查路径,帮助开发者快速掌握边框设置规范并提升界面视觉一致性。

CSS3动画属性有哪些:常用属性与用法说明
前端开发 · 2026-09-01

CSS3动画属性有哪些:常用属性与用法说明

CSS3动画主要分为transition过渡与animation关键帧两类。本文梳理常用属性、简写语法与@keyframes规则,结合悬停、入场、循环等场景给出代码示例与选型建议,帮助开发者快速写出流畅且可控的动画效果。

CSS3渐变色语法与常见用法
前端开发 · 2026-09-01

CSS3渐变色语法与常见用法

CSS3渐变色通过纯代码生成平滑颜色过渡,广泛用于按钮、横幅与卡片背景。本文系统梳理线性与径向渐变的核心语法、方向控制、停靠点设置及多层叠加技巧,提供可直接复用的场景代码,并给出兼容性策略与常见渲染异常排查方法,帮助开发者快速构建稳定、可维护的渐变样式。

CSS3手册中文版下载指南:获取渠道、筛选标准与使用建议
前端开发 · 2026-09-01

CSS3手册中文版下载指南:获取渠道、筛选标准与使用建议

寻找CSS3手册中文版下载资源时,如何判断来源可靠性、筛选高质量内容并有效使用?本文从获取渠道、版本识别、下载验收到替代方案,提供一套可执行的判断标准,帮助你快速找到适合学习或查阅的中文手册。