js是一种单线程语言,简单的说就是一条通道,多任务的情况下,就会出现拥挤的情况,这种情况发生了‘多线程’,但是这种‘多线程’是通过单线程模仿的,也即是假的,那么就产生了同步任务和异步任务。
·同步任务:同步任务不进行等待,必须立即看到执行过程,如console.log
·异步任务:异步任务需要进行等待一定的时候才能看到结果,如setTimeout(定时器)、网络请求
微任务、宏任务 宏任务和微任务都是异步任务,最开始的时候只有宏任务,但是后来程序员发现异步任务全程排队一个一个执行不太好,因为就算是异步任务里面也有一些代码更需要执行,就是说它要(插队),这个时候就有了微任务。
然后代码执行顺序发生改变
先执行同步代码
遇到宏任务,放入列队
遇到微任务,放入微任务列队
执行栈为空
将微任务放入栈执行
所有的微任务完成之后,取出宏任务列来执行
只要有微任务就执行微任务
下面举例常用的宏任务和微任务
| 任务(代码) | 宏/微任务 | 环境 |
|---|---|---|
| script | 宏任务 | 浏览器 |
| 事件 | 宏任务 | 浏览器 |
| 网络请求(Ajax) | 宏任务 | 浏览器 |
| setTimeout()定时器 | 宏任务 | 浏览器/Node |
| fs.readFile()读取文件 | 宏任务 | Node |
| Promise.then() | 微任务 | 浏览器/Node |