返回
Event Loop:浏览器背后的事件引擎
前端
2023-10-14 19:03:11
Event Loop详解
Event Loop是一个不断循环的过程,它从事件队列中获取事件,并将其分发到适当的处理程序中执行。Event Loop主要由以下几个部分组成:
- 事件队列 (Event Queue) :存储等待被处理的事件。
- 任务队列 (Task Queue) :存储需要被执行的脚本任务。
- 微任务队列 (Microtask Queue) :存储需要被执行的微任务。
Event Loop工作原理
Event Loop以循环的方式工作,它的主要流程如下:
- Event Loop从事件队列中获取事件,并将其分发到适当的处理程序中执行。
- 事件处理程序执行完毕后,将控制权交还给Event Loop。
- Event Loop从任务队列中获取脚本任务,并将其执行。
- 脚本任务执行完毕后,将控制权交还给Event Loop。
- Event Loop从微任务队列中获取微任务,并将其执行。
- 微任务执行完毕后,控制权交还给Event Loop。
- Event Loop重复上述过程,直到所有事件、任务和微任务都被处理完毕。
Event Loop中任务的优先级
在Event Loop中,任务的优先级如下:
- 微任务 (Microtask) :优先级最高,会在所有宏任务之前执行。
- 宏任务 (Macrotask) :优先级低于微任务,包括脚本任务、定时器、I/O操作等。
一道题加深理解
为了加深对Event Loop的理解,我们来看一道题:
在浏览器中,以下代码的执行顺序是什么?
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
Promise.resolve().then(() => {
console.log(3);
});
console.log(4);
解析 :
- 首先,代码中的console.log(1)会被立即执行,输出1。
- 接下来,setTimeout(() => { console.log(2); }, 0)被执行,它将一个延迟0毫秒的任务添加到事件队列中。
- 然后,Promise.resolve().then(() => { console.log(3); })被执行,它将一个微任务添加到微任务队列中。
- 最后,console.log(4)被执行,输出4。
- 在Event Loop的下一个循环中,微任务队列中的微任务被执行,输出3。
- 接着,事件队列中的任务被执行,输出2。
因此,代码的执行顺序是:1 -> 4 -> 3 -> 2。