2016-04-25 156 views
1

我目前正试图解决我们的Javascript产品上的一些内存问题,我想知道是否有任何机会通过splice方法从数组中删除项目可能导致任何内存泄漏,或者它是否等于null价值去除? 如果数组存储在全局范围内,它是否会改变某些内容?可能Array.splice导致内存泄漏?

例如片断1:

var myArray = [...]; // init the array; 
myArray.splice(indexOfTheItemToRemove, 1); 

VS片段2:

var myArray = [...]; // init the array; 
var temp = myArray.splice(indexOfTheItemToRemove, 1); 
temp.length = 0; 
temp = null; 

谢谢。

回答

2

根据Mozilla Developer Network

一些函数调用导致对象分配。

所以,确实有splice调用内存分配。

然而,JavaScript有一个垃圾收集器,这使我们文章的下一个部分:

这是最天真的垃圾收集算法。这个算法减少了“不再需要一个对象”的定义到“一个对象没有其他对象引用它”。如果零引用指向此对象,则该对象被视为垃圾收集。

果然,只要我们不将函数的结果赋值给变量,就没有对它的引用。因此,垃圾收集器可以很容易地释放分配的内存。

我们可以很容易地通过在浏览器中运行这段代码检查了我们的假设:

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选项卡上的内存分配。

enter image description here

的尖峰点在内存释放的事件,我们可以看到,内存消耗水平恢复到初始状态。

所以,答案是:不,这里没有内存泄漏。

+0

太好了,谢谢你的详细解答! – kalnic29