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);

设置限制的不是生成器,而是解构赋值。