ジェネレーター関数です。
ジェネレーターは、終了して後で再入力できる関数です。それらのコンテキスト (変数バインディング) は、再入口間で保存されます。
ジェネレーター関数を呼び出しても、その本体はすぐには実行されません。代わりに、関数の iterator オブジェクトが返されます。イテレータのメソッドが呼び出されると、イテレータから返される値を指定するnext()
最初の式までジェネレータ関数の本体が実行されるか、または を使用して別のジェネレータ関数に委任されます。yield
yield*
歴史的なメモ:
の提案された構文ですEcmaScript.next
。
Mozilla の Dave Herman がEcmaScript.nextについて講演しました。30:15で彼は発電機について話します。
彼は以前、Mozilla がどのように委員会の舵取りを助けるために提案された言語変更を実験的に実装しているかを説明しました。Dave は、Mozilla の CTO (だと思います) であり、元の JavaScript デザイナーである Brendan Eich と緊密に協力しています。
EcmaScript ワーキング グループ wiki で詳細を確認できます: http://wiki.ecmascript.org/doku.php?id=harmony:generators
ワーキング グループ (TC-39) は、EcmaScript.next に何らかのジェネレータ イテレータの提案が必要であるという一般的な合意を得ていますが、これは最終的なものではありません。
言語の次のバージョンで変更なしにこれが表示されることに依存するべきではありません。変更されなくても、おそらくしばらくの間、他のブラウザで広く表示されることはありません.
概要
中断された実行コンテキスト (つまり、関数のアクティブ化) をカプセル化するオブジェクトとして表される、ファーストクラスのコルーチン。先行技術: Python、Icon、Lua、Scheme、Smalltalk。
例
フィボナッチ数列の「無限」数列 (2 53付近の動作にもかかわらず):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
ジェネレーターはループで繰り返すことができます:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
ジェネレーターはイテレーターです:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8