BFE.devAI解答 - 前端面试问题
46. 请分别说明在Browser和Node.js中的Event Loop
在Browser中的Event Loop是指浏览器的JavaScript引擎维护的一系列任务队列,负责诸如处理用户输入、动画、网络请求等任务,以及将这些任务分发到主线程的任务队列中,等待主线程空闲时执行。Browser中的Event Loop由以下几个阶段组成:
-
任务队列(Task Queues):包括宏任务队列(Macrotasks)和微任务队列(Microtasks)。
-
宏任务(Macrotasks):包括setTimeout/setInterval、I/O请求、UI事件等。
-
微任务(Microtasks):这是一个相对较新的概念,它包括Promise、MutationObserver等API提供的微任务。
-
渲染(Rendering):GUI渲染和页面重绘。
-
宿主(Host):由浏览器所提供的宿主环境,包括window对象、XMLHttpRequest对象等。
Node.js中的Event Loop则与Browser存在一些差异。Node.js的Event Loop由以下几个阶段组成:
-
执行Timer(Timer):检查Timer队列中是否有定时任务需要执行。
-
执行I/O(I/O Callbacks):处理之前异步任务的回调。
-
执行idle/prepare(idle, prepare):内部使用。
-
执行轮询(Poll):等待新的I/O事件(如新的TCP连接),并处理之前的I/O事件的回调。
-
检查、关闭事件(Check, Close callbacks):执行setImmediate()的回调。
-
timers阶段(Timers):执行setImmediate()的回调。
注意,在Node.js中,所有的微任务都在执行完宏任务后执行,这与Browser是不同的。同时,在Browser和Node.js中,宏任务和微任务都是异步的,并且它们的执行是基于先进先出的原则。