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 *'的定义。 | 生活水平 | |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | 39.0 | 25 (13.10586) | 26.0 (26.0) | No support | 26 | 10 |
yield* | (Yes) | 25 (13.10586) | 27.0 (27.0) | No support | 26 | 10 |
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 | ? | ? |
Feature | Android | Android Webview | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|---|
Basic support | No support | (Yes) | ? | 26.0 (26.0) | No support | No support | 10 | 39.0 |
yield* | No support | (Yes) | ? | 27.0 (27.0) | No support | No support | 10 | (Yes) |
IteratorResult object instead of throwing | No support | ? | ? | 29.0 (29.0) | No support | No 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)。