7

「新規」と通常の関数を直接呼び出すことの違いを知っています。

しかし、ジェネレーター関数の場合はどうでしょうか?

例えば:

function *counter(){
    let n = 0;
    while (n < 2) {
        yield n++;
    }
    return 10;
}

var countIter1 = new counter();
var countIter2 = counter();

彼らは同じようですか?

4

1 に答える 1

1

ジェネレーターを使用すると、独自の状態を維持できる単一の関数を作成することで、反復アルゴリズムを定義できます。ジェネレーターは、イテレーターのファクトリーとして機能する特別なタイプの関数です。1 つ以上の yield 式が含まれている場合、関数はジェネレーターになります。ジェネレーター関数が呼び出されると、関数の本体はすぐには実行されません。代わりに、ジェネレーター イテレーター オブジェクトを返します。ジェネレーターイテレーターの next() メソッドを呼び出すたびに、次の yield 式まで関数の本体が実行され、その結果が返されます。関数の最後または return ステートメントに到達すると、StopIteration 例外がスローされます。ジェネレーター関数は、クラスの反復子メソッドとして直接使用できるため、カスタム反復子の作成に必要なコードの量が大幅に削減されます。

 function Range(low, high){
      this.low = low;
      this.high = high;
    }
    Range.prototype.__iterator__ = function(){
      for (var i = this.low; i <= this.high; i++)
        yield i;
    };
    var range = new Range(3, 5);
    for (var i in range)
      print(i); // prints 3, then 4, then 5 in sequence

すべてのジェネレーターが終了するわけではありません。無限シーケンスを表すジェネレーターを作成することができます。

于 2014-03-27T06:23:28.680 に答える