JavaScript,生成器 - 'yield' 如何在未设置退出条件时从循环中中断?
JavaScript, Generators - How does 'yield' break from a loop, when no exit condition is set?
所以我复习了一些 JS,并遇到了以下简单斐波那契计算器的示例:
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
var [first, second, third, fourth, fifth, sixth] = fibs();
// first = 0
// second = 1
// third = 1
// fourth = 2
// fifth = 3
// sixth = 5
无论您在结果数组中放入多少元素,该函数都会精确地循环正确的次数,然后退出。从不多,从不少,没有错误。
var [first, second] = fibs(); // Works great!
var [a, b, c, d, e, f, g, h, I, j, k, l] = fibs(); // Still works!
我一直在梳理文档,但找不到任何可能暗示正在发生的事情。
生成器如何知道何时跳出循环并结束循环?没有退出条件,没有任何迹象表明这会做任何事情,但 运行 永远。
非常感谢。
编辑#1
是否有另一种方法可以使用同一个生成器来获取序列中的第 n 个数字,而不需要潜在的巨大结果数组?
How does the generator know when to break out of the loop and be done with it?
没有。生成器永远不会跳出循环。只是解构赋值只调用生成器的迭代器 X 次(与解构赋值中的变量个数一样多)。迭代器不知道你已经完成了它,它只是响应它收到的 "next" 调用。
有点像这样:
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
// Pseudo-destructuring:
let first, second, third;
{
const iterator = fibs();
first = iterator.next().value;
second = iterator.next().value;
third = iterator.next().value;
// Now, our "destructuring" is done, so we just...don't call
// the iterator anymore
}
console.log(first, second, third);
设置限制的不是生成器,而是解构赋值。
所以我复习了一些 JS,并遇到了以下简单斐波那契计算器的示例:
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
var [first, second, third, fourth, fifth, sixth] = fibs();
// first = 0
// second = 1
// third = 1
// fourth = 2
// fifth = 3
// sixth = 5
无论您在结果数组中放入多少元素,该函数都会精确地循环正确的次数,然后退出。从不多,从不少,没有错误。
var [first, second] = fibs(); // Works great!
var [a, b, c, d, e, f, g, h, I, j, k, l] = fibs(); // Still works!
我一直在梳理文档,但找不到任何可能暗示正在发生的事情。
生成器如何知道何时跳出循环并结束循环?没有退出条件,没有任何迹象表明这会做任何事情,但 运行 永远。
非常感谢。
编辑#1
是否有另一种方法可以使用同一个生成器来获取序列中的第 n 个数字,而不需要潜在的巨大结果数组?
How does the generator know when to break out of the loop and be done with it?
没有。生成器永远不会跳出循环。只是解构赋值只调用生成器的迭代器 X 次(与解构赋值中的变量个数一样多)。迭代器不知道你已经完成了它,它只是响应它收到的 "next" 调用。
有点像这样:
function* fibs() {
var a = 0;
var b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
// Pseudo-destructuring:
let first, second, third;
{
const iterator = fibs();
first = iterator.next().value;
second = iterator.next().value;
third = iterator.next().value;
// Now, our "destructuring" is done, so we just...don't call
// the iterator anymore
}
console.log(first, second, third);
设置限制的不是生成器,而是解构赋值。