在JavaScript中,生成器函数是一种特殊的函数类型,它允许编写可以暂停和恢复执行的代码。生成器通过function*关键字定义,并使用yield表达式来控制迭代过程。

以下是关于JavaScript生成器函数的关键点:

  1. 定义语法
function* generatorFunctionName([param1[, param2[, ...]]]) {
  // 生成器函数体,包含yield语句
  yield value1;
  yield value2;
  // ...
  return finalValue; // 可选,返回一个最终值(如果需要)
}
  1. 迭代器对象
    当调用生成器函数时,不会立即执行函数体中的代码,而是返回一个迭代器对象。这个迭代器具有next()方法。
  2. 执行流程
  • 通过调用迭代器的next()方法开始执行生成器函数。
  • 函数会执行到遇到的第一个yield表达式,并返回一个包含两个属性的对象:{value: yieldedValue, done: false},其中yieldedValueyield表达式的值,done表示是否已经完成迭代(初次执行时为false)。
  • 每次调用next()都会从上次暂停的地方继续执行,直到遇到下一个yield或到达函数结束(如果有return语句,则返回最后的return值并设置done: true)。
  1. 用途
  • 异步编程:生成器可以与异步库(如async/await之前的时代配合Promise进行异步处理)一起用于简化复杂的回调逻辑,实现类似同步代码的写法。
  • 数据流控制:生成器可用于创建自定义迭代算法,例如遍历大型数据集而无需一次性加载所有数据。
  • 状态维护:由于每次调用next()都会保持内部状态,因此生成器可用于模拟协程,即有状态的、可挂起和恢复执行的子程序。
  1. 示例
function* countUp() {
  let i = 0;
  while (true) {
    yield i++;
  }
}

const counter = countUp();
console.log(counter.next().value); // 0
console.log(counter.next().value); // 1
// ...

在这个例子中,countUp是一个生成器函数,它无限递增地生成整数序列。每次调用.next()都返回一个新的数字值。