当前位置:首页 > JavaScript

js eventloop实现

2026-03-14 03:53:54JavaScript

JavaScript 事件循环实现原理

JavaScript 的事件循环(Event Loop)是其异步编程的核心机制,通过单线程处理非阻塞 I/O 操作。以下是其实现的关键组成部分:

调用栈(Call Stack)

调用栈用于跟踪当前执行的函数。当函数被调用时,它会被推入栈顶;执行完毕后弹出。同步代码按顺序执行,阻塞栈直到完成。

function foo() {
  console.log('foo');
}
function bar() {
  foo();
  console.log('bar');
}
bar();
// 输出顺序: foo → bar

任务队列(Task Queue)

异步操作(如 setTimeoutfetch)的回调函数会被放入任务队列。事件循环在调用栈为空时,将队列中的任务推入栈执行。

console.log('Start');
setTimeout(() => console.log('Timeout'), 0);
console.log('End');
// 输出顺序: Start → End → Timeout

微任务队列(Microtask Queue)

Promise 和 MutationObserver 的回调属于微任务,优先级高于普通任务(宏任务)。每次调用栈清空后,会先处理所有微任务。

js eventloop实现

Promise.resolve().then(() => console.log('Microtask'));
setTimeout(() => console.log('Macrotask'), 0);
// 输出顺序: Microtask → Macrotask

事件循环流程

  1. 执行同步代码:填充调用栈直至清空。
  2. 检查微任务队列:全部执行完毕,直到队列为空。
  3. 渲染更新(如需要):执行 UI 渲染。
  4. 处理宏任务:取一个任务执行,重复步骤 2-4。

代码示例分析

console.log('Script start');

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

Promise.resolve()
  .then(() => console.log('Promise 1'))
  .then(() => console.log('Promise 2'));

console.log('Script end');

// 输出顺序:
// Script start → Script end → Promise 1 → Promise 2 → setTimeout

常见异步场景

  • 宏任务setTimeoutsetInterval、I/O 操作、UI 渲染。
  • 微任务Promise.thenqueueMicrotaskMutationObserver

Node.js 与浏览器的差异

  • Node.js:使用 libuv 实现事件循环,包含多个阶段(如 pollcheck)。
  • 浏览器:由渲染引擎(如 V8)管理,与 DOM 渲染紧密结合。

通过理解事件循环的优先级和队列机制,可以避免常见的异步陷阱(如竞态条件),并优化代码执行顺序。

标签: jseventloop
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现复制功能

js实现复制功能

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

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…