不太了解将值传递给 next() 如何与 JavaScript 中的 yield 一起使用

Not quite understanding how passing a value to next() works with yield in JavaScript

Mozilla Developer Network 有以下向 next() 传递值的示例以及 yield 如何捕获该值:

function* fibonacci() {
  let current = 0;
  let next = 1;
  while (true) {
    let reset = yield current;
    [current, next] = [next, next + current];
    if (reset) {
        current = 0;
        next = 1;
    }
  }
}

const sequence = fibonacci();
console.log(sequence.next().value);     // 0
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 2
console.log(sequence.next().value);     // 3
console.log(sequence.next().value);     // 5
console.log(sequence.next().value);     // 8
console.log(sequence.next(true).value); // 0
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 2

令我感到困惑的是 let reset = yield current; 行。我知道 current 将接收传递给 next() 的值。我理解的是为什么一旦current是大于1的任何值if (reset) { /* ... */ }条件就不会计算为真。

似乎 let reset = yield current; 行仅在将值传递给 next() 时才被评估,但我不确定实际情况是否如此,更不用说为什么会这样了所以。 MDN 文档掩盖了这里实际发生的事情。

如有进一步说明,将不胜感激。

编辑:换句话说,当一个值未传递到 next() 时,let reset = yield current; 是什么意思?因为 current 的值仍在随着循环的每个 运行 增加。作业根本就没有发生吗?

function* fibonacci() {
  let current = 0;
  let next = 1;
  while (true) {
    let reset = yield current;
    console.log('reset value', reset);
    [current, next] = [next, next + current];
    if (reset) {
        current = 0;
        next = 1;
    }
  }
}

const sequence = fibonacci();
console.log(sequence.next().value);     // 0
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 2
console.log(sequence.next().value);     // 3
console.log(sequence.next().value);     // 5
console.log(sequence.next().value);     // 8
console.log(sequence.next(true).value); // 0
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 1
console.log(sequence.next().value);     // 2

只使用控制台日志。我们可以看到 reset 变量在没有传递给 next() 时得到 undefined 的值,否则得到传递给 next 的值。
您可以在 javascript 中将值 undefined 赋给一个变量,这就是这里发生的所有事情。

我不喜欢他们使用如此不相关的代码示例。在没有现实生活背景的情况下,很难理解这一点或为什么要使用它。

添加一个答案以提供更多 detail/clarity 给可能和我一样难过的其他人。这种看似奇怪的行为的另一个关键方面是要记住,yield 会暂停生成器的执行,直到再次调用 next()。以下代码(在此处找到的 MDN 示例代码的略微修改版本:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield)说明了这一点(特别注意变量 step 何时具有值):

function* counter(value) {
 let step;

 while (true) {
   step = yield ++value;
   console.log(`step = ${step}, value = ${value}`);

   if (step) {
     value += step;
   }
 }
}

const generatorFunc = counter(0);
console.log(generatorFunc.next().value);   
console.log(generatorFunc.next().value);   
console.log(generatorFunc.next().value);   
console.log(generatorFunc.next(10).value); 
console.log(generatorFunc.next().value);   
console.log(generatorFunc.next(10).value);

输出:

1
"step = undefined, value = 1"
2
"step = undefined, value = 2"
3
"step = 10, value = 3"
14
"step = undefined, value = 14"
15
"step = 10, value = 15"
26