当前位置:首页 > JavaScript

js实现eventloop

2026-04-06 06:37:30JavaScript

js实现eventloop

Event Loop 的基本概念

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

js实现eventloop

  • 调用栈(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');

输出顺序

  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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…