2016-07-28 7 views
0

に第一、第二降伏リターンを行い、なぜnext()最初コールはyield2番目のキーワードの後に​​来る値を返すのですか?最初next()はなぜ以下のコードでは、この発電機

function* generatorFunction() { 
    yield (yield 'the second yield')(); 
} 

function func(x) { 
    return 'func passed to the second next()'; 
} 

var iterator = generatorFunction(); 

var firstValue = iterator.next().value; 
var secondValue = iterator.next(func).value; 

console.log(firstValue); // "the second yield" 
console.log(secondValue); // "func passed to the second next()" 

それは右、式として最初yield後の行の残りの部分を扱い?つまり、(yield x)()はxと評価されますが、評価中は実際には歩留まりが一時停止しませんか?

nextの2回目の呼び出しでは、関数が渡され、(yield 'the second yield')の代わりに実行され、その値が返されます。

誰でもここで起こっていることを説明できますか?

これは実際的な目的ではありませんが、私はes6katasを使っています。

+0

@estusと合意するだけです。まず最初に返される場合、最初の 'yield'は何を返しますか? –

+0

私はあまりにも文字通り最初の収穫で停止していたと思います。 (私は実際に何を返すのか疑問に思っていました。)それで、返品のように、yieldの式が評価される順序で返されます。理にかなって、感謝します。 @estusは自由にそれを答えにコピーします。 –

+0

私は '言語感覚'に訴える代わりに演算子の優先順位の説明でそれを補強しました。 – estus

答えて

1

これは良い例ですが、かなり自己説明的です。

発現

yield (yield 'the second yield')(); 

operator precedenceによれば、裏返しに評価されます。

まず、外側yieldの右側部分が評価されます。(yield 'the second yield')()です。

左機能部分、(yield 'the second yield')グループが最初に評価されます。 'the second yield'の値が最初のnext()コールから返された場合、ジェネレータは内部yieldで一時停止されます。

ジェネレータはnext(func)コールで再開し、yield 'the second yield'が送信された値(func)に評価され、次に右機能部func()は、'func passed to the second next()'と評価されます。

最後に、外部yieldの左部分が評価され、が第2のnext(func)コールから返され、ジェネレータが一時停止されます。

関連する問題