「新規」と通常の関数を直接呼び出すことの違いを知っています。
しかし、ジェネレーター関数の場合はどうでしょうか?
例えば:
function *counter(){
let n = 0;
while (n < 2) {
yield n++;
}
return 10;
}
var countIter1 = new counter();
var countIter2 = counter();
彼らは同じようですか?
「新規」と通常の関数を直接呼び出すことの違いを知っています。
しかし、ジェネレーター関数の場合はどうでしょうか?
例えば:
function *counter(){
let n = 0;
while (n < 2) {
yield n++;
}
return 10;
}
var countIter1 = new counter();
var countIter2 = counter();
彼らは同じようですか?
ジェネレーターを使用すると、独自の状態を維持できる単一の関数を作成することで、反復アルゴリズムを定義できます。ジェネレーターは、イテレーターのファクトリーとして機能する特別なタイプの関数です。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
すべてのジェネレーターが終了するわけではありません。無限シーケンスを表すジェネレーターを作成することができます。