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

Ste*_*lis 5 javascript functional-programming memory-management node.js

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);
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 4

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

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

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

奇怪的是,就在今天早些时候,我们还提出了一个关于非常相似主题的问题;也可以在那里看到我的答案。