yield
yield
yield
关键字用于暂停和恢复生成器函数(function*
或传统生成器函数)。
句法
[rv] = yield [expression];
expression
定义通过迭代器协议从生成器函数返回的值。如果省略,则返回undefined
。rv
返回传递给生成器next()
方法的可选值以恢复其执行。
描述
yield
关键字暂停生成器功能执行和下面的表达式的值yield
的关键字返回到发生器的调用者。它可以被认为是return
关键字的基于生成器的版本。
yield
关键字实际上返回一个IteratorResult
具有两个属性的对象,value
和done
。value
属性是评估的结果yield
表达,并且done
是false
,指示生成器函数还没有完全完成。
暂停yield
表达式之后,生成器的代码执行将保持暂停状态,直到next()
调用生成器的方法。每次next()
调用生成器的方法时,生成器都会恢复执行并运行,直到达到以下之一:
yield
,它使发生器再次暂停并返回发生器的新值。下一次next()
被调用时,执行会立即在语句后重新开始yield
。
如果将可选值传递给生成器的next()
方法,则该值将成为生成器当前yield
操作返回的值。
在生成器的代码路径,其yield
运营商以及通过传递给它指定新的起始值的能力之间Generator.prototype.next()
,生成器提供了巨大的动力和控制力。
示例
The following code is the declaration of an example generator function.
function* foo() {
var index = 0;
while (index <= 2)
yield index++;
}
一旦定义了生成器函数,就可以通过构造一个迭代器来使用它,如图所示。
var iterator = foo(
console.log(iterator.next() // { value: 0, done: false }
console.log(iterator.next() // { value: 1, done: false }
console.log(iterator.next() // { value: 2, done: false }
console.log(iterator.next() // { value: undefined, done: true }
规范
规范 | 状态 | 评论 |
---|---|---|
ECMAScript 2015(第6版,ECMA-262)该规范中'收益'的定义。 | 标准 | 初始定义。 |
ECMAScript最新草案(ECMA-262)该规范中“收益率”的定义。 | Living Standard | |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | 39 | (Yes) | 26.0 (26.0) | ? | ? | 10 |
IteratorResult object instead of throwing | ? | ? | 29.0 (29.0) | ? | ? | 10 |
Feature | Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | 26.0 (26.0) | ? | ? | 10 |
IteratorResult object instead of throwing | ? | ? | 29.0 (29.0) | ? | ? | 10 |