function*

function*

function*声明(function关键字后跟一个星号)定义了发电机功能,它返回一个Generator对象。

你也可以使用GeneratorFunction构造函数和function* expression来定义生成器函数。

句法

function* name([param[, param[, ... param]]]) { statements }

name函数名称。param要传递给函数的参数的名称。一个函数最多可以有255个参数。statements这些陈述包含了函数的主体。

描述

Generators是可以退出并随后重新输入的功能。他们的上下文(变量绑定)将在重新入口时保存。

调用生成器函数不会立即执行其主体;而是返回该函数的迭代器对象。当迭代器的next()方法被调用时,生成器函数的主体将被执行,直到第一个yield表达式指定要从迭代器返回的值,或者与yield*,委托给另一个生成器函数。该next()方法返回一个对象,该对象的value属性包含已赋值的值以及done指示生成器是否已将其最后值作为布尔值生成的属性。next()使用参数调用该方法将恢复生成器函数的执行,用参数替换yield执行暂停的语句next()

return生成器中的语句在执行时会生成生成器done。如果一个值被return编辑,它将作为返回value。已经返回的发电机不会产生更多的值。

示例

简单的例子

function* idMaker() { var index = 0; while (index < 3) yield index++; } var gen = idMaker( console.log(gen.next().value // 0 console.log(gen.next().value // 1 console.log(gen.next().value // 2 console.log(gen.next().value // undefined // ...

yield*的示例

function* anotherGenerator(i) { yield i + 1; yield i + 2; yield i + 3; } function* generator(i) { yield i; yield* anotherGenerator(i yield i + 10; } var gen = generator(10 console.log(gen.next().value // 10 console.log(gen.next().value // 11 console.log(gen.next().value // 12 console.log(gen.next().value // 13 console.log(gen.next().value // 20

将参数传递给Generators

function* logGenerator() { console.log(yield console.log(yield console.log(yield } var gen = logGenerator( // the first call of next executes from the start of the function // until the first yield statement gen.next( gen.next('pretzel' // pretzel gen.next('california' // california gen.next('mayonnaise' // mayonnaise

生成器中的返回语句

function* yieldAndReturn() { yield "Y"; return "R"; yield "unreachable"; } var gen = yieldAndReturn() console.log(gen.next() // { value: "Y", done: false } console.log(gen.next() // { value: "R", done: true } console.log(gen.next() // { value: undefined, done: true }

Generators are not constructable

function* f() {} var obj = new f; // throws "TypeError: f is not a constructor"

规范

规范状态评论
ECMAScript 2015(第6版,ECMA-262)该规范中'函数*'的定义。标准初始定义。
ECMAScript 2016(ECMA-262)该规范中'function *'的定义。标准改变了生成器不应该有[构造]陷阱,并会在与新的一起使用时抛出。
ECMAScript最新草案(ECMA-262)该规范中'function *'的定义。生活水平

浏览器兼容性

FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic support39.025 (13.10586)26.0 (26.0)No support2610
yield*(Yes)25 (13.10586)27.0 (27.0)No support2610
IteratorResult object instead of throwing(Yes)25 (13.10586)29.0 (29.0)No support(Yes)?
Not constructable with new as per ES2016(Yes)?43.0 (43.0)No support?10
Trailing comma in parameters??52.0 (52.0)No support??

FeatureAndroidAndroid WebviewEdgeFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Basic supportNo support(Yes)?26.0 (26.0)No supportNo support1039.0
yield*No support(Yes)?27.0 (27.0)No supportNo support10(Yes)
IteratorResult object instead of throwingNo support??29.0 (29.0)No supportNo support?(Yes)
Not constructable with new as per ES2016???43.0 (43.0)????
Trailing comma in parameters???52.0 (52.0)????

Firefox-specific notes

Generators and iterators in Firefox versions before 26

较早的Firefox版本实现了较旧版本的生成器提案。在旧版本中,生成器是使用常规function关键字(不带星号)和其他差异来定义的。有关更多信息,请参阅传统生成器函数。

IteratorResult 对象返回而不是抛出

从Gecko 29(Firefox 29 / Thunderbird 29 / SeaMonkey 2.26)开始,完整的生成器函数不再抛出TypeError“生成器已经完成”。相反,它会返回一个IteratorResult对象,如{ value: undefined, done: true }(bug958951)。