返回

JavaScript事件循环机制EventLoop深入剖析

前端

JavaScript事件循环机制EventLoop深入剖析

事件循环机制

事件循环机制EventLoop是浏览器或Node环境中的一种解决JavaScript异步执行的机制。它允许JavaScript在执行主线程的代码时,同时处理来自外部的事件,如用户交互、网络请求等。通过EventLoop,这些外部事件被转化为事件队列中的任务,并被主线程依次执行。

浏览器事件循环

在浏览器环境中,EventLoop主要负责管理浏览器中发生的各种事件,包括用户交互事件(如鼠标点击、键盘输入等)、定时器事件(如setTimeout、setInterval等)、网络请求事件(如AJAX请求等)。当这些事件发生时,它们会被添加到事件队列中,等待主线程执行。

Node事件循环

在Node环境中,EventLoop主要负责管理Node中的异步操作,包括网络请求、文件系统操作、定时器事件等。与浏览器中的EventLoop类似,当这些异步操作完成时,它们会被添加到事件队列中,等待主线程执行。

事件队列

事件队列是一个存储事件的队列。当事件发生时,它们会被添加到事件队列中,等待主线程执行。事件队列中的事件按照先进先出的原则被执行,即最早添加到队列中的事件会被最先执行。

任务队列

任务队列是存储任务的队列。当事件被执行时,它们会生成任务,并将这些任务添加到任务队列中。任务队列中的任务也是按照先进先出的原则被执行,即最早添加到队列中的任务会被最先执行。

宏任务

宏任务是指那些需要花费较长时间才能执行的任务,如定时器事件、I/O操作等。宏任务会在事件队列中的事件执行完成后,被添加到任务队列中。

微任务

微任务是指那些执行时间很短的任务,如Promise的then方法、MutationObserver的回调函数等。微任务会在宏任务执行完成之后,被添加到任务队列中。

事件循环的工作原理

事件循环的工作原理可以简单地概括为以下步骤:

  1. 主线程执行事件队列中的事件。
  2. 事件执行完成之后,生成的任务被添加到任务队列中。
  3. 主线程执行任务队列中的任务。
  4. 任务执行完成之后,如果有新的事件发生,则将其添加到事件队列中。
  5. 重复步骤1-4,直到所有事件和任务都执行完成。

EventLoop流程图

以下是一个简化的EventLoop流程图:

[图片]

代码示例

以下是一个简单的代码示例,演示了EventLoop的工作原理:

setTimeout(() => {
  console.log('宏任务1');
}, 0);

Promise.resolve().then(() => {
  console.log('微任务1');
});

console.log('主线程');

setTimeout(() => {
  console.log('宏任务2');
}, 0);

Promise.resolve().then(() => {
  console.log('微任务2');
});

运行这段代码,可以得到以下输出结果:

主线程
微任务1
宏任务1
微任务2
宏任务2

从输出结果可以看出,主线程首先执行了主线程中的代码,然后执行了事件队列中的事件(setTimeout),接着执行了任务队列中的任务(Promise的then方法),最后又执行了事件队列中的事件和任务队列中的任务。