浏览器事件循环之宏任务和微任务

JavaScript022

浏览器事件循环之宏任务和微任务,第1张

node 事件循环见: https://www.jianshu.com/p/69d2b70d3163 。

参考: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/?utm_source=html5weekly

we don't add another mutation microtask as one is already pending

三个概念: JS堆栈、宏任务、微任务。

js 是一个单线程语言。

在执行一个js文件的过程中, js堆栈 中一直有任务,执行过程中,如果碰到了 宏任务 或者 微任务 ,会将其分别放入 宏任务队列 微任务队列 中。

当js文件被执行完, js堆栈 为空,此时执行 微任务队列 中的所有任务。当执行 微任务 过程中碰到 宏任务 或者 微任务 ,同样会将其分别放入 宏任务队列 微任务队列 中。

微任务队列 为空,此时执行 宏任务队列 中的所有任务。在执行过程中

宏任务按顺序执行,且浏览器在每个宏任务之间渲染页面

所有微任务也按顺序执行,且在以下场景会立即执行所有微任务:

例子:

执行结果:(Chrome 89)

首先,先看一下下面这道题,列出输出的内容:

先公布答案,输出依次为:1,7,3,5,2,6,4。

要解释为什么,需要先解释清楚几个概念:

JavaScript是单线程。当遇到异步加载时候,存在两个队列:宏队列、微队列。他们各司其职,处理对应的任务。具体顺序是,先执行常规事件流,再执行微队列,最后执行宏队列,当循环完成后,js引擎休息等待下一次循环。

好了,概念说完了,是不是很简单。下面我们回到上面那道题。我们从上到下演示一下各队列的现状。

吐槽一句:本来很简单的道理,很简单就能解释清楚的问题,有些网友的解释真的是极度的复杂啊,害得我浪费了好多脑细胞。。。还有些抄来抄去的结论根本不对,误导啊。。。

js执行时有两个异步队列: 宏队列 微队列 。优先执行微队列中的任务,而且每次执行完宏队列中的任务后,都会查看微队列中是否有任务,假如有任务则先执行微队列中的任务,再执行宏队列中的任务。例外:浏览器会先执行一个宏任务—— script 。

执行结果如下: