什么时候进入检查点,清空微任务,当前调用栈清空的时候
例子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()
在栈中才算执行完,最后执行微任务。