web-dev-qa-db-ja.com

JavaScriptの「関数*」とは何ですか?

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;
    }
}

私はすでに yieldletおよび[?,?]=[?,?]が何をするか を知っていますが、function*が何を意味するのか分かりません。それは何ですか?

追伸Googleを試してみてはいけません。アスタリスク付きの式を検索するのは 不可能 です( プレースホルダとして使用されます )。

233
string QNA

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
188
Mike Samuel

これは ジェネレーター関数 -であり、引用したページで、「これは興味深い行です」に置き換えたコメントで...

基本的に、事前にシーケンス全体(おそらく無限大)を計算しなくても、シーケンスをプログラムで指定し、インデックスで要素をアクセスできるようにする方法です。

49

function*タイプは、反復可能なプロセスのジェネレーター関数として機能するように見えます。 C#には、「yield return」を使用してこのような機能があります 1を参照 および 2を参照

基本的に、これは各関数をこの関数を繰り返しているものに1つずつ返します。そのため、ユースケースはforeachスタイルのループでそれを示しています。

11
invalidsyntax