阐述 JS 事件循环 EventLoop?
题干
- 事件循环 EventLoop
题解
EventLoop
即事件循环是一个执行模型,是一种用于管理和调度异步任务的机制,它在不同的地方有不同的实现。浏览器和 NodeJS 基于不同的技术实现了各自的 EventLoop
。
JS 有一个主线程,用来执行同步代码,而针对异步代码,JS 存在异步队列,由于 JS 任务又分为宏任务和微任务,所以队列有两种,宏任务队列以及微任务队列。
引擎开始解析时,整体 JS 代码,即整个 Script
脚本就是第一个宏任务,直接进入主线程执行,执行过程中会遇到一些异步任务(包含宏任务微任务),宏任务进入宏任务队列,微任务进入微任务队列。
当主线程代码执行结束后,此时主线程空闲,则会检查微任务队列,如果该队列中存在任务,则依次将各个微任务移入主线程执行,直到执行掉所有的微任务。
如果没有微任务或者执行完所有的微任务之后,开始检查宏任务队列,将宏任务队列中下一个宏任务移入主线程执行,在执行下一个宏任务之前,浏览器会做一次渲染操作。
从开始执行,到下一个宏任务执行前,被称为一次循环。
在执行微任务时,微任务回调也可能会出现异步宏任务或者异步微任务,如上述一样,入队等候即可。
每个宏任务执行完后,就会清空当前执行栈所产生的所有微任务,然后才会进行下一个宏任务的执行。
整个过程就是先执行一个宏任务,再执行宏任务所产生的所有微任务,接着再执行下一个宏任务,微任务回调也会产生宏任务微任务,如此不断重复,这被称为事件循环,即 EventLoop
。
相关
setTimeout(fn, 0)多久才执行 -> Event Loop?
JS 中事件循环和 Node 事件循环区别?process.nextTick 执行顺序?