当前位置:首页 > 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(是否执行完毕)。

示例:无限序列

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

js yield 实现

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) 传递:

js yield 实现

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 结合,用于异步操作:

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实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现目录

js实现目录

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

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js实现隐藏div

js实现隐藏div

隐藏div的几种方法 使用JavaScript隐藏div元素可以通过多种方式实现,以下是几种常见的方法: 方法一:修改style.display属性 将div的display属性设置为"none"…

js尚未实现

js尚未实现

JavaScript 尚未实现的功能 JavaScript 作为一门不断发展的语言,仍有一些功能尚未被原生支持或标准化。以下是一些常见的尚未实现的功能或特性: Promise.any() 的替代方案…