JavaScript是单线程语言,只有一条执行任务的队列,容易带来进程堵塞的问题,为了解决这个问题,js有两种任务的执行模式:同步模式和异步模式
在异步模式下,创建异步任务主要分为宏任务与微任务两种。ES6 规范中,宏任务(Macrotask) 称为 Task, 微任务(Microtask) 称为 Jobs。宏任务是由宿主(浏览器、Node)发起的,而微任务由 JS 自身发起。
宏任务
常见宏任务
<script>整体代码块- 新程序或子程序被直接执行
- 事件的回调函数
- setTimeout(),setInterval()
微任务
- Promise.then().catch().finally()
- MutationObserver
- Object.observer
执行顺序:
先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。
宏任务(<script>标签属于宏任务) =》 清空微任务列表 =》 Dom渲染 =》 清空宏任务
清空宏任务过程中遇到还有未处理的微任务 =》 清空微任务 =》 Dom 渲染 =》 宏任务(没有微任务的情况下清空宏任务)
图片来源:b站技术蛋老师