3

私はコードを持っています:

function * input(){
    let array = [];
    while(true) {
        array.push(yield array);
    }
}

var gen = input();
console.log(gen.next("A"))
console.log(gen.next("B"))
console.log(gen.next("C"))
console.log(gen.next("D"))

実行すると、次の出力が得られます。

{ value: [], done: false }
{ value: [ 'B' ], done: false }
{ value: [ 'B', 'C' ], done: false }
{ value: [ 'B', 'C', 'D' ], done: false }

A結果の最初の行が配列に含まれないのはなぜですか? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*#Passing_arguments_into_Generatorsのこのページからの説明が 1 つあります。コメントは言う

next() の最初の呼び出しは、関数の開始から最初の yield ステートメントまで実行されます

しかし、私のテストから、それは正しくないようです。私のテストコードは次のとおりです。

function* logGenerator() {
    console.log("before yield in function");
    yield 1;
    console.log("filler 1");
    yield 2;
    console.log("filler 2");
    yield 3;
    console.log("filler 3");
}

var gen = logGenerator();

console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());

結果は次のとおりです。

before yield in function
{ value: 1, done: false }
-----------------
filler 1
{ value: 2, done: false }
-----------------
filler 2
{ value: 3, done: false }
-----------------
filler 3
{ value: undefined, done: true }

ご覧のとおり、最初next()の は最初の の前のステートメントを実行しただけyieldでなく、最初のyieldステートメントも実行しました。その理論では私の質問を説明できません。誰でも私を正しい方向に向けるのを助けることができますか? 前もって感謝します。

4

2 に答える 2

0
function * foo () {
  var i = 0
  yield i

  i += 1
  yield i

  i += 1
  i += 2
  yield i
}

var gen = foo()
console.log(gen.next()) // 0
console.log(gen.next()) // 1
console.log(gen.next()) // 4

var gen = foo()はジェネレータのインスタンスを作成するだけであることに注意してください。.next()これは、ジェネレーターの実行を開始する最初の呼び出しです。yieldジェネレーターはステートメントに到達するまで実行され、そのステートメントの値を返しますyield。この時点で、ジェネレーターは別の呼び出し.next()が実行されるまで一時停止されます。

したがって、すべてがあなたの例で意図したとおりに機能しています。最初の例では、最初のyieldステートメントが空の配列を返しています。次に.next()、渡された値が配列に取り込まれ、その配列が生成されます。コード内:

function * foo (param) {
  var array = []
  // do nothing with param
  yield array

  array.push(param) // 'B'
  yield array

  array.push(param) // 'C'
  yield array

  array.push(param) // 'D'
  yield array
}

これはドキュメントと一致します:

オプションの値がジェネレーターの next() メソッドに渡される場合、その値はジェネレーターの現在の yield 操作によって返される値になります。

于 2017-01-17T19:16:13.313 に答える