javascript - 我可以使用 setTimeout 创建一个廉价的无限循环吗?

标签 javascript node.js functional-programming memory-management

var recurse = function(steps, data, delay) {
    if(steps == 0) {
        console.log(data.length)
    } else {
        setTimeout(function(){
            recurse(steps - 1, data, delay);
        }, delay);
    }
};

var myData = "abc";
recurse(8000, myData, 1);

这段代码让我感到困扰的是我将一个字符串传递了 8000 次。这会导致任何类型的内存问题吗?

另外,如果我用 node.js 运行这段代码,它会立即打印出来,这不是我所期望的。

最佳答案

如果您担心字符串被复制 8,000 次,请不要担心,字符串只有一个副本;传递的是引用。

更大的问题是当你调用函数时创建的对象(称为“执行上下文”的“变量绑定(bind)对象”)是否被保留,因为你正在创建一个闭包,并且它有一个对变量的引用上下文的对象,因此只要闭包仍然在某处被引用,它就会保存在内存中。

答案是:是的,但只有在计时器触发之前才会发生,因为一旦它不执行任何操作就不再引用闭包,因此垃圾收集器可以回收它们。所以你不会有 8,000 个未完成的,只有一两个。当然,GC 何时运行以及如何运行取决于实现。

奇怪的是,就在今天早些时候,我们有 another question关于一个非常相似的话题;见my answer也有。

关于javascript - 我可以使用 setTimeout 创建一个廉价的无限循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7026224/

相关文章:

javascript - 如何将光标聚焦在 Stripe 输入元素上

javascript - 如果有二维坐标,如何获取一维数组的信息?

javascript - 在 MongooseJS 中填充子文档数组

javascript - 使用 --access public 发布到 npm 不起作用?

Haskell - 检查列表是否至少包含 N 次元素

haskell - Haskell 中的树构建函数(作业)

javascript - 为什么jQuery中这行代码要用li呢?

javascript - JQuery 101 - 更改文本值

node.js - 为 Node.js 安装 Web 服务器

haskell - 管理 FP 中的复杂状态