5

可能重复:
如何在 JavaScript 中清空数组 在 javascript
中释放数组数组的最佳方法

我有一个对象数组:

var arr = [complexObj1, complexObj2];

如果我想清除数组并确保没有内存泄漏,下面会做吗?

arr.length = 0;

或者我是否需要遍历我的数组并调用类似:

complexObj.release(); or
arr[0] = null; or 
delete arr[0];

?

4

4 回答 4

2

如果数组由不引用其他方法或 DOM 元素的简单对象组成,那么上述所有解决方案就足够了。

但是,如果数组包含的对象又包含对已附加到 DOM 元素的事件处理程序的引用,则在清除数组时该对象不会被销毁。

var Complex = function(nodeId){
   this.node=document.getElementById(nodeId);
   this.handler=function(e){alert('wohooo'};

   this.node.addEventListener('click', this.handler);
}

var myArray = [new Complex('buttonOne'), new Complex('buttonTwo')];

如果您现在使用myArray = []. 数组将被清理,但对象仍包含一个节点和一个实时事件处理程序,该处理程序将在单击按钮时触发,这意味着无法从内存中删除该对象。您只是通过从数组中删除而丢失了对它的引用。

您的第一个想法是正确的,因为您应该以某种方式“销毁”复杂对象并删除它拥有的任何引用。

Complex.prototype.release = function() {
    this.node.removeEventListener('click',this.handler);
    delete this.handler;
    delete this.node

}

您现在遍历数组并调用对象上的 release 以从节点中删除事件侦听器。

这是我认为人们通常会错过的一个简单示例。它也不必是事件处理程序,但可以是在复杂对象之外引用的任何内容。

于 2012-10-08T11:00:23.700 回答
1

只需重新初始化数组:

arr = [];
于 2012-10-08T09:42:25.797 回答
0

你需要做的只是

arr = null
于 2012-10-08T09:42:34.870 回答
0

就像是

var t = myArray;
delete myArray;
//or
myArray = null;
于 2012-10-08T09:45:49.947 回答