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/