当前位置:首页 > JavaScript

js实现eventloop

2026-04-06 06:37:30JavaScript

Event Loop 的基本概念

Event Loop 是 JavaScript 运行时处理异步任务的核心机制。它负责调度和执行任务,确保非阻塞的代码运行。Event Loop 分为以下几个部分:

  • 调用栈(Call Stack):同步代码按顺序执行,函数调用会被压入栈中,执行完成后弹出。
  • 任务队列(Task Queue):异步任务(如 setTimeoutsetInterval)完成后,回调函数会被放入任务队列。
  • 微任务队列(Microtask Queue):优先级更高,包含 Promise.thenMutationObserver 等回调。

Event Loop 的执行流程

  1. 执行同步代码:调用栈依次执行同步任务,遇到异步任务时交给 Web API 处理(如 setTimeout)。
  2. 处理微任务:当调用栈为空时,Event Loop 优先检查微任务队列并执行所有微任务。
  3. 渲染(如果需要):浏览器可能会在此时进行 UI 渲染。
  4. 处理宏任务:从任务队列中取出一个宏任务(如 setTimeout 回调)执行,然后回到第 2 步。

代码示例

console.log('Start');

setTimeout(() => {
  console.log('Timeout callback');
}, 0);

Promise.resolve().then(() => {
  console.log('Promise resolved');
});

console.log('End');

输出顺序

js实现eventloop

  1. Start
  2. End
  3. Promise resolved(微任务优先)
  4. Timeout callback(宏任务)

关键点

  • 微任务(如 Promise)比宏任务(如 setTimeout)优先级更高。
  • async/await 本质是 Promise 的语法糖,属于微任务。
  • 渲染(如 requestAnimationFrame)的时机在微任务之后、宏任务之前。

常见面试题分析

setTimeout(() => console.log(1), 0);

Promise.resolve().then(() => {
  console.log(2);
  Promise.resolve().then(() => console.log(3));
});

console.log(4);

输出顺序4 → 2 → 3 → 1。原因:微任务队列会一次性清空,嵌套的 Promise 仍属于微任务。

标签: jseventloop
分享给朋友:

相关文章

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…