this ページで、新しいJavaScript関数タイプを見つけました。
// NOTE: "function*" is not supported yet in Firefox.
// Remove the asterisk in order for this code to work in Firefox 13
function* fibonacci() { // !!! this is the interesting line !!!
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
私はすでに yield
、let
および[?,?]=[?,?]
が何をするか を知っていますが、function*
が何を意味するのか分かりません。それは何ですか?
追伸Googleを試してみてはいけません。アスタリスク付きの式を検索するのは 不可能 です( プレースホルダとして使用されます )。
Generator 関数です。
ジェネレータは、終了して後で再入力できる関数です。それらのコンテキスト(変数バインディング)は、再入可能に保存されます。
ジェネレーター関数を呼び出しても、その本体はすぐには実行されません。代わりに、関数の反復子オブジェクトが返されます。イテレータの
next()
メソッドが呼び出されると、イテレータから返される値を指定する最初のyield
式まで、またはyield*
で別のデリゲートに委任されるまで、ジェネレータ関数の本体が実行されますジェネレーター機能。
歴史的注記:
EcmaScript.next
に対して提案されている構文です。
MozillaのDave Hermanが EcmaScript.next について講演しました。 :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
これは ジェネレーター関数 -であり、引用したページで、「これは興味深い行です」に置き換えたコメントで...
基本的に、事前にシーケンス全体(おそらく無限大)を計算しなくても、シーケンスをプログラムで指定し、インデックスで要素をアクセスできるようにする方法です。