1.引入:
由于JS是单线程语言,所以在执行代码的过程中,上面的代码没有执行完成,下面的代码就会一直等待;试想一下,如果我们在代码中发送请求获取数据,而由于网络慢等原因,该操作就比较耗时,如果要等该操作执行完再执行后续的代码,这显然是不合理的,cpu空出来了,利用率降低了,而代码的执行时间也增加了
2.异步:
(紧接上文)我们希望发送一个请求,而这个请求会在浏览器http异步请求的线程里去完成;发送请求以后,就立即执行下面的代码,而需要用到请求结果的代码,则等到请求完成后自动执行;没错,这就是异步的概念。总结一下就是把一段代码放到未来去执行
3.事件循环
(紧接上文)因此,就出现了异步队列;当执行js代码时,遇到异步任务(也就是我们期望在未来执行的一段代码),就会将该任务丢进异步队列挂 起,然后接着执行后面的同步代码;当同步代码执行完毕以后,就将异步队列里的任务拿出来放到函数执行栈里去执行;
其中,异步队列又分为宏任务队列和微任务队列,同步代码执行完毕以后会扫描微任务对列,将达到条件的微任务拿出来执行,扫描完毕后,再扫描宏任务队列,每执行一个宏任务就会扫描微任务队列,宏任务队列扫描完毕,又来扫描微任务队列;而这一循环往复的过程就叫做浏览器的事件循环
4.常见的宏任务:
setTimeOut setInterval setImmediate MessageChannel
requestAnimationFrame I/O 以及UI交互事件
5.常见的微任务:
Promise MutationObserver Object.observer process.nextTick