4月第8题:谈谈浏览器中的 Event Loop

Posted 前端面试每天1题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4月第8题:谈谈浏览器中的 Event Loop相关的知识,希望对你有一定的参考价值。


1、Micro-Task 与 Macro-Task

浏览器端事件循环中的异步队列有两种:macro(宏任务)队列和 micro(微任务)队列。

常见的 macro-task:setTimeout、setInterval、script(整体代码)、 I/O 操作、UI 渲染等。
常见的 micro-task: new Promise().then(回调)、MutationObserve 等。
2、扩展:requestAnimationFrame

requestAnimationFrame也属于异步执行的方法,但该方法既不属于宏任务,也不属于微任务。按照MDN中的定义:

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

requestAnimationFrame是GUI渲染之前执行,但在Micro-Task之后,不过requestAnimationFrame不一定会在当前帧必须执行,由浏览器根据当前的策略自行决定在哪一帧执行。

3、event loop过程

当某个宏任务执行完后,会查看是否有微任务队列。如果有,先执行微任务队列中的所有任务,如果没有,会读取宏任务队列中排在最前的任务,执行宏任务的过程中,遇到微任务,依次加入微任务队列。栈空后,再次读取微任务队列里的任务,依次类推。


以上是关于4月第8题:谈谈浏览器中的 Event Loop的主要内容,如果未能解决你的问题,请参考以下文章

结合Event Loop谈谈对Vue中nextTick的理解

浏览器中的event loop, 简单了解。

面试经典:Event Loop

多图生动详解浏览器与Node环境下的Event Loop

事件循环Event Loop--JS篇

不要混淆nodejs和浏览器中的event loop