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

解析执行过程

  1. 开始执行遇到setTimeout会丢进宏任务中去
  2. 遇到new Promise时打印 2 然后 遇到 r 的then丢进微任务,往下执行 打印 3
  3. 最后打印5,主线程就全部跑完。
  4. 然后执行微任务 打印 4 ,微任务也全部跑完
  5. 接下来执行宏任务setTimeout 打印 1

所以结果为: 2、3、5、4、1

js中分为主线程、微任务、宏任务,其中(微任务、宏任务)属于异步执行

js解析器执行过程

执行顺序为:主线程 => 微任务 => 宏任务
会先将属于主线程的代码全部执行完成,遇到微任务和宏任务的代码会丢进去,将主线程执行完成后在回来调用微任务,将微任务全部执行完成,最后在调用宏任务代码

主线程

主线程先跑完依次执行

微任务

常见微任务有:

  • Promise.then catch finally
  • MutationObserver //监听dom节点是否有变化
  • process.nextTick
  • IntersectionObserver // 监听dom节点是否出现在你的可视区域

    宏任务

    常见宏任务有:

  • setTimeout

  • setInterval
  • setImmediate
  • requestAnimationFrame