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