概要
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 |
|---|---|---|---|---|---|---|
| 基本サポート | 未サポート | 未サポート | (有) | 未サポート | 未サポート | 未サポート |
関連情報
レガシージェネレーター
- The legacy generator function
- The legacy generator function expression
StopIteration- The legacy Iterator protocol