Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

function* 声明function关键字后跟一个星号)定义一个generator(生成器)函数,返回一个Generator对象。

你也可以用GeneratorFunction构造器和function* expression定义一个generator函数

语法

function* name([param[, param[, ... param]]]) { statements }
name
函数名
param
传入函数的参数名,一个函数至多可有255个参数。
statements
函数的主体

描述

生成器是一种可以从中退出并在之后重新进入的函数。生成器的环境(绑定的变量)会在每次执行后被保存,下次进入时可继续使用。

调用一个生成器函数并不马上执行它的主体,而是返回一个这个生成器函数的迭代器(iterator)对象。当这个迭代器的next()方法被调用时,生成器函数的主体会被执行直至第一个yield表达式,该表达式定义了迭代器返回的值,或者,被 yield*委派至另一个生成器函数。next()方法返回一个对象,该对象有一个value属性,表示产出的值,和一个done属性,表示生成器是否已经产出了它最后的值。

示例

简单示例

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

规范

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
function*
Standard Initial definition.
ECMAScript 2017 Draft (ECMA-262)
function*
Draft  

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 39.0 26.0 (26.0) 未实现 26 未实现
yield* (Yes) 27.0 (27.0) 未实现 26 未实现
IteratorResult object instead of throwing (Yes) 29.0 (29.0) 未实现 (Yes) 未实现
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support 未实现 (Yes) 26.0 (26.0) 未实现 未实现 未实现 39.0
yield* 未实现 (Yes) 27.0 (27.0) 未实现 未实现 未实现 (Yes)
IteratorResult object instead of throwing 未实现 ? 29.0 (29.0) 未实现 未实现 未实现 (Yes)

Firefox-specific notes

Firefox 26之前的生成器和迭代器

旧版本的Firefox实施了旧版本的生成器提案。旧版中用普通的function关键字定义(没有星号).

IteratorResult不再抛出错误

从Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26)开始,完成的生成器函数不再抛出TypeError "generator has already finished". 而是返回一个IteratorResult对象:{ value: undefined, done: true } (bug 958951)。

相关链接

文档标签和贡献者

 此页面的贡献者: ShupingLiu, lunix01, simongfxu, ziyunfei, fskuok, teoli
 最后编辑者: ShupingLiu,