【问题标题】:Why this iteration works forever为什么这个迭代永远有效
【发布时间】:2021-02-05 15:06:53
【问题描述】:

为什么这段代码会无限运行。 我不明白发生了什么。

(function(){
    console.log("Start")

    function add(){
        s.delete(add); //When I delete this line, everything works fine.
        s.add(add);
        console.count("run")
    }

    const s = new Set([
        add
    ]);

    s.forEach(value => {
        value()
    });
    
    console.log("Finish")
})()

这是一个概览代码。

【问题讨论】:

    标签: javascript iteration


    【解决方案1】:

    答案在 Set.prototype.forEach 的规范中:

    每个值通常只被访问一次。 但是,一个值将是 revisited 如果它被访问后被删除然后重新添加 在 forEach 调用完成之前。 在 对 forEach 的调用开始并且在被访问之前不会被访问,除非 在 forEach 调用完成之前再次添加该值。新价值观 在对 forEach 的调用开始后添加。

    由于它是您不断添加和运行的功能,因此它会一直这样做,删除并再次添加它。因此,您创建了一个无限循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多