1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの "function*"とは何ですか?

2022-04-18 11:34:57

質問

これ のページで、新しい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を試さなくても、それは ありえない で検索すると、アスタリスクのある表現( プレースホルダーとして使用される ).

解決方法は?

それは ジェネレータ 関数を使用します。

ジェネレータは、一旦終了して後で再入力することができる関数です。そのコンテキスト(変数バインディング)は再入力時に保存されます。

ジェネレータ関数を呼び出しても、その本体がすぐに実行されるわけではなく、関数のイテレータオブジェクトが代わりに返されます。イテレータの next() メソッドが呼ばれると、ジェネレータ関数の本体は、最初の yield この式は、イテレータから返される値を指定します。 yield* 他のジェネレータ関数に委ねる。


歴史的なメモ

の構文として提案されたものです。 EcmaScript.next .

MozillaのDave Herman氏は、以下のような講演を行いました。 EcmaScript.next . で 30:15 ジェネレーターについて話しています。

先に、委員会の舵取りをするために、Mozillaがどのように言語変更案を実験的に実装しているかを説明しています。Dave は Mozilla の CTO (だと思う) であり、オリジナルの JavaScript を設計した Brendan Eich と密接に連携しています。

EcmaScript working groupの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