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

JavaScript06

浏览器事件循环之宏任务和微任务,第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)

说到JavaScript的事件循环(Even loop)就会提到同步事件和异步事件

整个JS在运行过程中主要执行以下事件循环

上面就是一个简单的事件循环过程,那么在异步任务中还有宏任务和微任务的区别,他们具体的定义如下

微任务是异步任务中最早开始执行的,它可以是同步任务、宏任务执行时产生的,微任务能够在 实时性和效率 之间做一个有效的权衡,一般可以总结为一下几个方法

这里 Promise 、 Async/Await 、 Object.observe 以及 MutationObserver ,都是 JS语法内置的方法 , 不需要浏览器支持,可以理解为直接用JS引擎就能处理掉的任务

可以理解为每一个宏任务进程中都包含了一个微任务进程, 事件的触发 非JS部分 以及 定时器 都可以归为宏任务

宏任务会触发新一轮的事件循环,下图就是宏微任务的执行流程图,

https://juejin.cn/post/6932263539839074311?utm_source=gold_browser_extension#heading-2

https://www.jianshu.com/p/75107522813f

https://www.jianshu.com/p/bfc3e319a96b

https://juejin.cn/post/6880787856353132552

https://www.cnblogs.com/fangdongdemao/p/10262209.html