2017-08-07 8 views
1

は私のサンプルコードです:ES6ジェネレータ:最初のnext()関数に渡された引数が機能しないのはなぜですか?ここ

function *g() { 
    while (true) { 
    console.log(yield) 
    } 
} 

var gen = g(); 
gen.next(3); // {value: undefined, done:false} 
gen.next(3); // 3 {value: undefined, done:false} 
gen.next(3); // 3 {value: undefined, done:false} 

最初next()関数に渡される最初の引数は動作しないのはなぜ?なぜ、valueプロパティの値がundefinedであるのですか?それが渡される引数の値ではないでしょうか?

+2

あなたは何も得ていないしているので、なぜあなたは戻って引数を取得するために期待していますか? – Bergi

答えて

2

ここでは発電機で発生することがあります。

最初の呼び出しはジェネレータを初期化し(イテレータを返します)、内部コードは実行しません。それ以降

、イテレータに.next(value)へのすべての呼び出しは、現在から返されるvalueyieldを一時停止し、次のyield(関数または終了)まで実行を継続し、yieldを返すこと-ed(又は返却)を通過します値。

今、最初の.nextコールで現在一時停止しているyieldは何ですか? 1つもないので、関数の先頭から実行を開始しました。

したがって、最初の値はundefinedで、最初のnextコールに何を渡しても無視されます。

yieldの値がundefinedの場合は、yieldとなります。

function *g() { 
 
    yield;  // yields undefined 
 
    yield 3; 
 
    yield 'a'; 
 
} 
 

 
for (const v of g()) { 
 
    console.log(v); 
 
}

+1

TIL for(const v of g()) 'のために、私はあなたがそれを行うことができるとは思わなかった!後見では、むしろポイントです。 – msanford

関連する問題