これはジェネレーター関数です。
ジェネレータは、終了して後で再び入力できる関数です。それらのコンテキスト(変数バインディング)は、再入場間で保存されます。
ジェネレータ関数を呼び出しても、本体はすぐには実行されません。代わりに、関数の反復子オブジェクトが返されます。イテレータのnext()
メソッドが呼び出されると、ジェネレータ関数の本体はyield
、イテレータから返される値を指定する最初の式、またはを使用しyield*
て別のジェネレータ関数にデリゲートするまで実行されます。
歴史的メモ:
これは、の提案された構文ですEcmaScript.next
。
MozillaのDave HermanがEcmaScript.nextについて講演しました。で30:15彼は発電機を語ります。
以前に、委員会の運営を支援するために、Mozillaが提案された言語変更を実験的に実装する方法を説明しています。Daveは、MozillaのCTO(私だと思います)であるBrendan Eich、および元のJavaScriptデザイナーと密接に連携しています。
EcmaScriptワーキンググループウィキで詳細を確認できます: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
function*
構文はFirefoxでv26以降サポートされています:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*。古いバージョンでは別の構文を使用していました。