宏任务,微任务

110 阅读1分钟

JavaScript是单线程语言,只有一条执行任务的队列,容易带来进程堵塞的问题,为了解决这个问题,js有两种任务的执行模式:同步模式和异步模式

在异步模式下,创建异步任务主要分为宏任务与微任务两种ES6 规范中,宏任务(Macrotask) 称为 Task, 微任务(Microtask) 称为 Jobs。宏任务是由宿主(浏览器、Node)发起的,而微任务由 JS 自身发起。

宏任务

常见宏任务

  • <script>整体代码块
  • 新程序或子程序被直接执行
  • 事件的回调函数
  • setTimeout(),setInterval()

微任务

  • Promise.then().catch().finally()
  • MutationObserver
  • Object.observer

执行顺序:

先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

宏任务(<script>标签属于宏任务) =》 清空微任务列表 =》 Dom渲染 =》 清空宏任务

清空宏任务过程中遇到还有未处理的微任务 =》 清空微任务 =》 Dom 渲染 =》 宏任务(没有微任务的情况下清空宏任务)

图片来源:b站技术蛋老师 image.png