19、详细说明下 Event Loop

Web 环境

事件循环:是实现单线程环境下异步编程的关键机制

首先 JS 是单线程的,所以只能一行行处理代码。

为什么是单线程?因为是故意如此,为了阻塞页面的渲染,这样就不与 html、css 的解析产生冲突,所以是单线程阻塞的

遇到阻塞代码(接口请求)时,如果一直等待则会平白浪费时间,所以产生了异步任务。
遇到异步任务时,将其放到异步任务处理器中执行,执行完毕后将回调函数放到事件队列中,主线程继续处理同步代码。

事件队列是专门存放异步任务的回调函数的

当主线程将本次的同步代码执行完毕后,就去事件队列中拿回调函数来执行。

这个拿回调函数来执行的机制是事件循环。
所以事件循环就是从任务队列拿任务的机制。
任务队列里面又分为:宏任务、微任务
第一次整个 script 里面的代码作为宏任务被执行
执行时遇到异步任务:setTimeout、Promise 等,将 setTimeout 的回调放入宏任务,将 Promise 的回调放入微任务
等当前宏任务(即 script 里面的同步代码执行完毕后),去清理掉所有的微任务
当微任务清理掉后,拿一个宏任务来执行,在执行期间若又遇到了异步任务,则分别放入对应的宏、微任务队列中

当本次宏任务结束后,又清楚所有的微任务,然后拿下一个宏任务继续执行。

所以宏任务每次都只会执行一个,微任务每次都会清掉所有的。

浏览器整个任务的流程是:宏任务 -> 微任务 -> requestAnmimateFrame -> UI 渲染 -> requestIdleCallback

所以:Event Loop 是 JS 中执行异步任务的机制

Node 环境


19、详细说明下 Event Loop
https://mrhzq.github.io/职业上一二事/前端面试/每日一题/19、详细说明下 Event Loop/
作者
黄智强
发布于
2024年1月23日
许可协议