質問: generator(10); console.log(gen.next().value); console.log(gen.next().value); /* 期待する結果 */ // 10 // log1: 10 // yield2 // log2: yield2 /* jsfiddle purejs、 chrome console */ // 10 // log1: undefined // yield2 // (出力なし) ``` **yieldの結果を代入しているサンプル** ----------------------- es6-cheatsheet - Generators ES6時代のNode.js - Generator化 **developer.mozilla.org** ------------------------- developer.mozilla.org - function* FireFoxではIteratorResultオブジェクトがが返される?代入しているケースはこのことを指している?
回答: 2点あります。 1. `yield`の戻り値は`next()`の引数です。引数を指定しないばあいは`undefined`になります。`gen.next('test').value`などとしてみてください。"test"の文字が表示されると思います。 2. `yield`部分から先は次に`next()`が呼ばれるまで**実行されません**。正確に言うと、ジェネレーターは`next()`で次の値が求められたとき、現在の位置から`yield`が現れるまでの処理をし、そこで停止します。これは関数の初めからそうなっており、ジェネレーターでは`next()`が呼ばれるまでは1行も処理されません。 また、この処理は行単位では無く、式単位になります。`console.log(yield 10);`などと書いた場合、コンソールに表示されるのは次の`next()`が呼ばれたタイミングです。 ジェネレーターを最後まで実行するには`yield`よりも一つ多い`next()`を呼ぶ必要があります。そして、その`next().done`が`true`になることで全てが終わったことが確認できます。 ジェネレーターはECMAScript 2015で正式採用された仕様であり、Firefox、Chrome、Edgeなどの最新ブラウザであれば正式に導入されています。ただし、IE11など古いブラウザでは使用できませんのでご注意ください。