讲事件循环之前我们要先了解JS单线程,什么是异步任务,什么是同步任务,宏任务微任务包括什么以及他的执行顺序
一、JS单线程
1. 定义
- 同一时间只能做一件事,比如先添加dom节点,再删除dom节点。
2. 缺点
有些任务是耗时的会阻塞代码执行,不可能等到setTimeout执行完在执行下一步,这个时候就有了同步和异步的概念
二、同步、异步
1、概念
同步代码:立即放入JS引擎(JS主线程)执行,并原地等待结果
异步代码:先放入宿主环境(浏览器/Node),不必原地等待结果,并不阻塞主线程继续往下执行,异步结果在将来执行。 异步代码有一个共同点:耗时
2、执行过程
执行的过程中先把异步任务交给宿主环境,时机到了之后会推送到任务队列里面去,执行栈先把同步任务执行完,再去取任务队列里的异步任务
执行栈到任务队列里面反复查找的过程就叫做 事件循环
三、事件循环
- JS是单线程,防止代码阻塞,我们把代码(任务):同步和异步
- 同步代码给js引擎执行,异步代码交给宿主环境
- 同步代码放入执行栈中,异步代码等待时机成熟送入任务队列排队
- 执行栈执行完毕,会去任务队列看是否有异步任务,有就送到执行栈执行,反复循环查看执行,这个过程是事件循环(eventloop)
四、宏任务、微任务
1、执行过程
2、执行顺序
3、代码举例
console.log(1)
setTimeout(function () {
console.log(2)
},0)
const p = new Promise((resolve, reject) => {
console.log(3)
resole(1000)//标记为成功
console.log(4)
})
p.then(data =>{
console.log(data)
})
console.log(5)
执行图如下:
打印结果:1=>3=>4=>5=>1000=>2