微任务在当前宏任务结束后立即执行并清空队列,宏任务则每次只执行一个;事件循环每轮依次执行宏任务、收集微任务、清空微任务队列、可选UI渲染。

微任务和宏任务的核心区别在于执行时机和优先级:微任务在当前宏任务结束后立即执行,且必须清空整个微任务队列;宏任务则按事件循环一轮一轮调度,每次只取一个。
执行顺序是固定的四步循环
浏览器中 JavaScript 的事件循环严格遵循以下顺序(每轮):
执行一个宏任务(如 script 全局代码、setTimeout 回调、点击事件等) 执行过程中遇到的微任务(如 Promise.then、queueMicrotask)暂不执行,而是加入微任务队列 当前宏任务一结束,立刻连续执行所有已排队的微任务(FIFO,队列清空为止) 微任务清空后,浏览器可能触发 UI 渲染(如有 DOM 变更),然后进入下一轮,取下一个宏任务
哪些是宏任务,哪些是微任务
常见宏任务:整体 script 脚本、setTimeout/setInterval、I/O 回调、UI 渲染、DOM 事件(click、input)、requestAnimationFrame(注意:它属于宏任务,但渲染前执行)
常见微任务:Promise.then/catch/finally、queueMicrotask、MutationObserver 回调
立即学习“Java免费学习笔记(深入)”;
⚠️ 注意:Node.js 中 process.nextTick 是微任务,且优先级高于 Promise.then,但这是 Node 独有,浏览器不支持。
典型代码执行顺序示例
看这段代码:
console.log(‘start’);
setTimeout(() => console.log(‘timeout’), 0);
Promise.resolve().then(() => console.log(‘promise’));
console.log(‘end’);
输出一定是:
start
end
promise
timeout
原因很直接:start 和 end 是同步代码,最先执行;promise 是微任务,在同步代码之后、下一个宏任务之前执行;timeout 是宏任务,排在微任务队列清空之后才轮到。
容易忽略的关键细节
微任务可以嵌套生成新微任务(比如在 then 里再写一个 then),它们会全部在本轮微任务阶段执行完,不会等到下一轮 setTimeout(0) 不代表“立刻执行”,它只是尽快被推入宏任务队列;实际执行要等当前宏任务 + 所有微任务完成,且主线程空闲 多个 setTimeout 如果延迟相同,执行顺序按添加顺序(先进先出);若延迟不同,则延迟小的先入队、先执行 UI 渲染不是强制步骤,只有在宏任务+微任务完成后检测到 DOM 变更,浏览器才会安排渲染
基本上就这些。
以上就是javascript的微任务和宏任务有什么区别_执行顺序如何?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1543172.html
微信扫一扫
支付宝扫一扫