当前位置:首页 > JavaScript

js yield 实现

2026-02-01 09:34:51JavaScript

yield 在 JavaScript 中的实现

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

基本语法

生成器函数通过 function* 声明,内部使用 yield 关键字暂停执行并返回一个值:

function* generatorExample() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = generatorExample();
console.log(gen.next().value); // 输出 1
console.log(gen.next().value); // 输出 2
console.log(gen.next().value); // 输出 3

生成器的工作原理

  1. 生成器对象:调用生成器函数不会立即执行函数体,而是返回一个生成器对象。
  2. next() 方法:每次调用 next() 会恢复执行,直到遇到 yieldreturn
  3. 返回值next() 返回一个对象,包含 valueyield 的值)和 done(是否执行完毕)。

示例:无限序列

生成器可以用于生成无限序列,例如斐波那契数列:

function* fibonacci() {
  let a = 0, b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

const fib = fibonacci();
console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2

与迭代器的关系

生成器对象实现了迭代器协议([Symbol.iterator]),可以直接用于 for...of 循环:

function* range(start, end) {
  for (let i = start; i <= end; i++) {
    yield i;
  }
}

for (const num of range(1, 5)) {
  console.log(num); // 依次输出 1, 2, 3, 4, 5
}

双向通信

yield 可以接收外部传入的值,通过 next(value) 传递:

function* twoWayCommunication() {
  const name = yield 'What is your name?';
  yield `Hello, ${name}!`;
}

const gen = twoWayCommunication();
console.log(gen.next().value); // "What is your name?"
console.log(gen.next('Alice').value); // "Hello, Alice!"

错误处理

可以通过 throw() 方法向生成器内部抛出错误:

function* errorHandling() {
  try {
    yield 1;
  } catch (error) {
    yield `Caught: ${error}`;
  }
}

const gen = errorHandling();
console.log(gen.next().value); // 1
console.log(gen.throw('Oops!').value); // "Caught: Oops!"

异步生成器

生成器可以与 async/await 结合,用于异步操作:

js yield 实现

async function* asyncGenerator() {
  const data = await fetch('https://api.example.com/data');
  yield data.json();
}

const gen = asyncGenerator();
gen.next().then(({ value }) => console.log(value));

总结

  • yield 是生成器函数的核心,用于暂停和恢复执行。
  • 生成器对象通过 next()throw()return() 方法控制。
  • 适用于惰性求值、无限序列和异步编程场景。

通过生成器可以实现复杂的控制流,例如协程(Coroutine)或状态机(State Machine)。

标签: jsyield
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…