概要

Generator オブジェクトは ジェネレーター関数 によって返され、iterable プロトコルiterator プロトコル の両方に従います。

構文

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
}

var g = gen(); // "Generator { }"

メソッド

Generator.prototype.next()
yield 式によって得られる値を返します。
Generator.prototype.return()
与えられた値を返し、ジェネレーターを終了します。
Generator.prototype.throw()
エラーをジェネレーターにスローします。

無限イテレーター

function idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

レガシージェネレーターオブジェクト

Firefox (SpiderMonkey) は JavaScript 1.7 で、ジェネレーター初期バージョンも実装しています。これは関数の宣言でアスタリスク (*) を必要としません (関数の本体で yield キーワードを使用するだけです)。しかしながら、レガシージェネレーターは非推奨です。使用しないで下さい; 削除される予定です (バグ 1083482)。

レガシージェネレーターメソッド

Generator.prototype.next()
yield 式によって得られる値を返します。 これは ES6 ジェネレーターオブジェクトの next() と一致します。
Generator.prototype.close()
ジェネレーターを閉じます。そのため、next() をコールすると、StopIteration エラーがスローされます。これは ES6 ジェネレーターオブジェクトの return() メソッドに一致します。
Generator.prototype.send()
ジェネレーターに値を送るために使われます。yield 式から値が返され、次の yield 式によって値を返します。send(x) は ES6 ジェネレーターオブジェクトの next(x) に一致します。
Generator.prototype.throw()
ジェネレーターにエラーをスローします。これはES6ジェネレーターオブジェクトの throw() に一致します。

レガシージェネレータの例

function fibonacci() {
  var a = yield 1;
  yield a * 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.send(10)); // 20
console.log(it.close());  // undefined
console.log(it.next());   // throws StopIteration (as the generator is now closed)

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Generator objects の定義
標準 初回定義。
ECMAScript 2017 Draft (ECMA-262)
Generator objects の定義
ドラフト  

ブラウザー実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート 未サポート (有) 未サポート 未サポート 未サポート
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート 未サポート 未サポート (有) 未サポート 未サポート 未サポート

関連情報

レガシージェネレーター

ES6 ジェネレーター

ドキュメントのタグと貢献者

 このページの貢献者: vyv03354, Uemmra3, dskmori, Javascipt, shide55
 最終更新者: vyv03354,