【问题标题】:JavaScript, Generators - How does 'yield' break from a loop, when no exit condition is set?JavaScript,生成器 - 当没有设置退出条件时,“yield”如何从循环中中断?
【发布时间】:2017-09-11 11:03:33
【问题描述】:

所以我在复习一些 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 个数字,而不会产生巨大的结果数组?

【问题讨论】:

    标签: javascript generator yield


    【解决方案1】:

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

    它没有。生成器永远不会跳出循环。只是解构赋值只调用了生成器的迭代器 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);

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

    【讨论】:

    • 完美,感谢您提供示例代码以清除它。
    猜你喜欢
    • 2020-02-23
    • 2016-11-23
    • 1970-01-01
    • 2023-01-12
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2022-01-25
    相关资源
    最近更新 更多