我目前正在尝试解决我们的Javascript产品上的一些内存问题,我想知道是否有可能通过splice
方法从数组中删除项目可能导致任何内存泄漏或者是它相当于null要删除的值?
如果数组存储在全局范围内,它会改变什么吗?
例如代码段1:
var myArray = [...]; // init the array;
myArray.splice(indexOfTheItemToRemove, 1);
vs snippet 2:
var myArray = [...]; // init the array;
var temp = myArray.splice(indexOfTheItemToRemove, 1);
temp.length = 0;
temp = null;
谢谢。
答案 0 :(得分:3)
某些函数调用会导致对象分配。
所以,确实在splice
电话上有一个内存分配。
然而,Javascript有一个垃圾收集器,它引导我们进入文章的下一部分:
这是最天真的垃圾收集算法。该算法减少了#34的定义;不再需要对象" to"一个对象没有引用它的其他对象"。如果指向此对象的引用为零,则该对象被视为可以收集垃圾。
果然,只要我们不将函数的结果赋给变量,就没有对它的引用。因此,垃圾收集器可以轻松释放分配的内存。
我们可以通过在浏览器中运行这段代码来轻松检查我们的假设:
var myArray;
var cycles = 100000;
var delay = 10;
(function step() {
myArray = ['a', 'b', 'c'];
myArray.splice(1, 1);
if (--cycles > 0) {
setTimeout(step, delay);
}
}());
我们可以检查Chrome开发工具上的内存分配' Timeline标签。
尖峰指向内存释放事件,我们可以看到内存消耗级别返回其初始状态。
所以答案是:不,这里没有内存泄漏。