js中宏任务和微任务执行顺序

47 阅读1分钟

事件循环

事件循环指在javascript引擎中等待任务,执行任务,进入休眠等待更多任务几种状态间转换的无限循环

js事件循环核心机制:同步代码 → 微任务队列 → 宏任务队列 的执行优先级

(function () { console.log(1) setTimeout(() => { console.log(2); }); queueMicrotask(() => console.log(3)) new Promise(resolve => { console.log(4); setTimeout(() => { resolve(); console.log(5); }, 0); Promise.resolve().then(() => console.log(6)); console.log(7); }).then(() => { console.log(8); Promise.resolve().then(() => console.log(9)); }); console.log(10); })();

宏任务

宏任务表示执行时间较长的任务,在每次时间循环时只会执行一个宏任务,执行完毕后处理微任务队列,所有微任务都执行完毕后进入下一个宏任务。

  • 定时器任务
  • dom事件回调
  • I/O操作
  • 浏览器用于执行动画的方法 requestAnimationFrame ,执行时机与渲染相关
  • Node.js 环境的 setImmediate
  • script 标签内主线程的同步代码(整体作为一个宏任务)

微任务

微任务表示更轻量的异步任务,当宏任务执行完毕之后立即执行。

  • Promise.then() / Promise.catch() / Promise.finally()
  • 浏览器监听 DOM 变化的 API 对象,比如:MutationObserver
  • 手动添加微任务API方法:queueMicrotask()
  • nodejs 中的 process.nextTick()

总结

js脚本优先执行同步代码,宏任务和微任务分别加入宏任务队列和微任务队列

同步代码执行完毕,执行一个宏任务,然后清空微任务队列,

执行下一个宏任务,重复该循环