不太了解将值传递给 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
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