私はthis article about javascript generatorsを読んでいた、と私は、次のスニペットに達し:このイテレータが次の値を返すのはなぜですか?
function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y/3);
return (x + y + z);
}
var it = foo(5);
// note: not sending anything into `next()` here
console.log(it.next()); // { value:6, done:false }
console.log(it.next(12)); // { value:8, done:false }
console.log(it.next(13)); // { value:42, done:true }
は、私が最初にit.next()
の目的を理解していません。この行を実行した後、イテレータをvar z = yield (y/3)
で一時停止し、yの値が6であるはずはありません。 it.next(12)
はyield (y/3)
のパラメータを供給し、その後zを4にする必要はありませんか?私はなぜ機能の結果が5 + 12 + 4ではないのか分かりません。どういうわけか、最初のit.next()
が無視されているかのようです。これは本当ですか?誰かが光を放つことができますか?
が、私はこれを正しく理解して助けて?基本的には、最初の 'it.next()'を呼び出した後、6が呼び出し側に返され、ノードは同じ収量で関数をサスペンドしていますか?したがって、 'it.next(12)'を呼び出すとき、x + 1ではなく12を使用します。 – Geo
@Geo:まさに 'yield'の仕組みですね:-)ほとんどの場合(イテレータのような)、渡される値は気にしません(あるいは値がまったく渡されない)が、できるこれでいくつかの素晴らしいこと。あなたの質問にリンクしている記事シリーズを読んでください! – Bergi