微任务什么时候执行

什么时候进入检查点,清空微任务,当前调用栈清空的时候

例子1

<body>
  <button id="btn">
    点击
  </button>

  <script>
    let btn = document.getElementById('btn')
    btn.addEventListener('click', () => {
      Promise.resolve().then(() => {
        console.log('M1')
      })
      console.log('L1')
    })
    btn.addEventListener('click', () => {
      Promise.resolve().then(() => {
        console.log('M2')
      })
      console.log('L2')
    })
  </script>
</body>

结果:L1 M1 L2 M2
第一个点击事件执行就清空了,然后执行二个事件,所以可以认为执行一个点击事件执行栈就清空了,然后执行微任务,然后执行下一个点击事件,然后执行微任务

例子2

<body>
  <button id="btn">
    点击
  </button>

  <script>
    let btn = document.getElementById('btn')
    btn.addEventListener('click', () => {
      Promise.resolve().then(() => {
        console.log('M1')
      })
      console.log('L1')
    })
    btn.addEventListener('click', () => {
      Promise.resolve().then(() => {
        console.log('M2')
      })
      console.log('L2')
    })
    btn.click() // 注意这行代码
  </script>
</body>

结果:L1 L2 M1 M2
执行了第一个点击事件没有清空执行栈,要继续执行第二个点击事件,当二个点击事件执行完,btn.click()在栈中才算执行完,最后执行微任务。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章