mozilla

生成器

该特性处于 ECMAScript 6 规范草案中,目前的实现在未来可能会发生微调,请谨慎使用。

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

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

语法

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

规范

规范 状态 备注
ECMAScript 2015 (6th Edition, ECMA-262)
function*
Standard 初始定义

浏览器兼容性

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 Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) 39.0 26.0 (26.0) 未实现 未实现 未实现
yield* (Yes) (Yes) 27.0 (27.0) 未实现 未实现 未实现
IteratorResult object instead of throwing ? (Yes) 29.0 (29.0) 未实现 未实现 未实现

Firefox特定备注

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)。

参见

文档标签和贡献者

标签: 
向此页面作出贡献: teoli, ziyunfei, fskuok, simongfxu
最后编辑者: simongfxu,
隐藏侧边栏