什么是微任务?什么是宏任务?

259 阅读2分钟

前言:

想了解什么是微任务和宏任务,首先得知道什么是异步任务,什么是同步任务?
试想一下,如果js的任务都是同步(书写顺序和执行顺序一致)的,那么遇到定时器,网络请求等这类型需要延时执行的任务会发生什么?
答案显然易见,页面可能会瘫痪,需要暂停下来等待这些需要很长时间才能执行完毕的代码
所以 :

  • 同步任务 : 同步任务不需要进行等待,必须立即看到执行结果,比如console
  • 异步任务 : 异步任务需要等待一定的时间才能看到结果,比如setTimeout、网络请求等
    异步任务 :
    宏任务 : 宿主环境的异步任务
    微任务 : ECMAScript语法约定的异步任务
    举例 :
    宏任务 : script, setTimeout, setInterval, ajax, 事件会调(click)
    微任务 : Promise.then ...
    需要明确: 微任务的优先级要高于宏任务.微任务执行以后,才会执行下一个宏任务

执行顺序 :

  • 先执行同步代码
  • 遇到宏任务,放入队列
  • 遇到微任务,放入微任务队列
  • 执行栈为空
  • 将微任务入栈执行
  • 所有的微任务完成之后,取出宏任务队列来执行
    助解图 :

333.png

代码练习 :

console.log(1)
setTimeout(function() {
  console.log(2)
  new Promise(function(resolve) {
    console.log(3)
    resolve()
  }).then(function() {
    console.log(4)
  })
})

new Promise(function(resolve) {
  console.log(5)
  resolve()
}).then(function() {
  console.log(6)
})
setTimeout(function() {
  console.log(7)
  new Promise(function(resolve) {
    console.log(8)
    resolve()
  }).then(function() {
    console.log(9)
  })
})
console.log(10)

分析
同步代码 : 1, 5, 10
微任务 : 3, 4, 6, 9
宏任务 : 2, 7
分析 : 49都是宏任务,但是他们都被宏任务setTimeout包裹,所以执行顺序先执行宏任务的2,7然后再执行微任务中的3,再讲4放入宏任务中,4执行. 9同理

结果: 1, 5, 10, 6, 2, 3, 4, 7, 8, 9,