当前位置:首页 > JavaScript

js yield 实现

2026-03-14 08:11:36JavaScript

yield 实现原理

在 JavaScript 中,yield 是生成器函数(Generator Function)的关键字,用于暂停和恢复函数执行。生成器函数通过 function* 语法定义,调用时返回一个生成器对象(Generator Object),该对象遵循迭代器协议。

基本用法示例

function* simpleGenerator() {
  yield 1;
  yield 2;
  return 3;
}

const gen = simpleGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: true }

实现机制

生成器函数通过 yield 暂停执行,保存当前上下文(包括局部变量、参数等)。每次调用 next() 方法时,函数从上次暂停处继续执行,直到遇到下一个 yieldreturn

手动模拟 yield

可以通过闭包和状态管理模拟生成器行为:

function createSimulatedGenerator() {
  let state = 0;
  return {
    next() {
      switch (state) {
        case 0:
          state++;
          return { value: 1, done: false };
        case 1:
          state++;
          return { value: 2, done: false };
        default:
          return { value: undefined, done: true };
      }
    }
  };
}

异步生成器

yield 可与异步操作结合,实现类似 async/await 的流程控制:

js yield 实现

async function* asyncGenerator() {
  const data = await fetchData();
  yield data;
}

注意事项

  • 生成器对象只能遍历一次,再次调用 next() 会返回 { done: true }
  • yield* 用于委托给另一个生成器或可迭代对象
  • 生成器函数不能使用箭头函数语法

实际应用场景

  • 惰性计算:按需生成值,节省内存
  • 状态机:管理复杂的状态转换
  • 异步流程控制:配合 Promise 使用

以上内容展示了 JavaScript 中 yield 的基本实现原理和使用方法,通过生成器函数可以实现更灵活的迭代控制和异步编程模式。

标签: jsyield
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…