JavaScript生成器 - 当没有设置退出条件时,'yield'如何在循环中跳出?

4

我在复习一些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个数字的方法,而无需一个可能巨大的结果数组?

1个回答

4

生成器如何知道何时退出循环并完成它?

它不会。生成器永远不会跳出循环。只是解构赋值仅调用生成器的迭代器X次(与解构赋值中变量的数量相同)。迭代器不知道你已经用完它,它只响应它接收到的“下一个”调用。

这有点像这样:

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

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


1
非常好,感谢您提供的示例代码来澄清这个问题。 - Birrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接