深入理解Event Loop
btn.addEventListener("click", event => {
setTimeout(() => {console.log("S1")}, 0)
Promise.resolve().then(() => console.log("M1"))
console.log("L1")
})
btn.addEventListener("click", event => {
setTimeout(() => {console.log("S2")}, 0)
Promise.resolve().then(() => console.log("M2"))
console.log("L2")
})
点击btn
输出:L1、M1、L2、M2、S1、S2
大致过程是这样的:
- 从浏览器的事件监听线程出发,看到btn被点击
- 将console.log("S1")交给浏览器中的定时器线程
- 将console.log("M1")加入微任务队列
- 将console.log("L1")加入JS主线程
- JS主线程执行任务输出“L1”
- 执行执行栈为空,微队列任务加入其中,输出“M1”
- 将console.log("S2")交给浏览器中的定时器线程
- 将console.log("M2")加入微任务队列
- 将console.log("L2")加入JS主线程
- JS主线程执行任务输出“L2”
- 执行执行栈为空,微队列任务加入其中,输出“M2”
- 定时器线程将log("S1")和log("S2")加入宏任务队列
- JS执行栈空着所以依次输出”S1“和”S2“
大家都很聪明,应该都理解!
btn.addEventListener("click", event => {
setTimeout(() => {console.log("S1")}, 0)
Promise.resolve().then(() => console.log("M1"))
console.log("L1")
})
btn.addEventListener("click", event => {
setTimeout(() => {console.log("S2")}, 0)
Promise.resolve().then(() => console.log("M2"))
console.log("L2")
})
btn.click()
输出:L1、L2、M1、M2、S1、S2
理解了上一个,这个就很好理解了,
js出发click事件所以在点击事件完成之前JS主线程中始终有一个btn.click等待着执行完毕返回结果。
大致过程就是
- S1进宏任务队列
- M1进微任务队列
- 输出L1
- S2进宏任务队列
- M2进微任务队列
- 输出L2
- 微任务队列的任务依次加入JS执行栈执行,输出M1,M2
- 宏任务队列的任务依次加入执行,输出S1,S2
奇库秀,我的头发又少了。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。