/**
* @return {Generator<number>}
*/
var fibGenerator = function*() {
let a = 0,
b = 1;
yield 0; // 返回 0,并暂停执行
yield 1; // 返回 1,并暂停执行
while(true) {
yield a + b; // 返回 a + b,并暂停执行
[a, b] = [b, a + b]; // 更新 a 和 b 的值
}
};
/**
* const gen = fibGenerator();
* gen.next().value; // 0
* gen.next().value; // 1
*/
yield
描述:
yield
关键字使生成器函数执行暂停,yield
关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的 return
关键字。
yield
关键字实际返回一个 IteratorResult
对象,它有两个属性,value
和 done
。value
属性是对 yield
表达式求值的结果,而 done
是 false
,表示生成器函数尚未完全完成。
一旦遇到 yield
表达式,生成器的代码将被暂停运行,直到生成器的 next()
方法被调用。每次调用生成器的 next()
方法时,生成器都会恢复执行,直到达到以下某个值:
yield
,导致生成器再次暂停并返回生成器的新值。下一次调用next()
时,在yield
之后紧接着的语句继续执行。- throw 用于从生成器中抛出异常。这让生成器完全停止执行,并在调用者中继续执行,正如通常情况下抛出异常一样。
- 到达生成器函数的结尾。在这种情况下,生成器的执行结束,并且
IteratorResult
给调用者返回value
的值是 undefined 并且done
为true
。 - 到达 return 语句。在这种情况下,生成器的执行结束,并将
IteratorResult
返回给调用者,其value
的值是由return
语句指定的,并且done
为true
。
如果将参数传递给生成器的 next()
方法,则该值将成为生成器当前 yield
操作返回的值。
在生成器的代码路径中的 yield
运算符,以及通过将其传递给 Generator.prototype.next() 指定新的起始值的能力之间,生成器提供了强大的控制力。