EventLoop,任务队列,宏任务,微任务关系说明
EventLoop是什么
EventLoop是JavaScript的主线程不断循环读取异步任务队列(event queue)的机制
JavaScript为避免多线程操作带来的复杂dom操作,将js设计成了单线程机制,而单线程意味如果在某一个操作任务卡死或者耗时太久,基本用户就退了。于是提出了Web Worker
,让js创建子线程来模拟实现多线程,而众多子线程中,有一个就是EventLoop,会一直读取任务
任务队列是什么
任务队列储存异步函数的回调,独立与线程之外。主线程会通过eventloop读取任务队列中准备好的异步函数回调,注意是回调,只有异步函数的回调会进任务队列,而任务队列中又分为宏任务和微任务
宏任务和微任务
常见的宏任务有script代码块,settimeout,i/o操作等,微任务如Promise的各种回调,
执行过程请看图
需要注意的是当执行完第一个宏任务,不会再继续执行下一个宏任务,优先开始处理完所有的微任务
好了,理论介绍完毕,来几个代码
代码执行
<script>
//第一个代码块
setTimeout(() => {
console.log(1)
}, 0)
new Promise((reslove) => {
console.log(2)
reslove()
}).then(() => {
console.log(3)
})
</script>
<script>
//第二个代码块
setTimeout(() => {
console.log(4)
}, 0)
new Promise((reslove) => {
console.log(5)
reslove()
}).then(() => {
console.log(6)
})
</script>
/// 输出结果
2
3
5
6
1
4
js遇到第一个settimeout和promise,全部扔到异步队列,因为script整体就是一个宏任务,不会立即执行这个settimeout,而是开始执行微任务,所以先输出2,3,继续执行下一个script宏任务,而因为js刚开始会执行所有的代码,开始运行第二个script代码块,输出5,6,而两个settimeout进入队列的时间最晚,所以1,4最后输出
前端