清除Javascript数组中的对象

时间:2012-10-08 09:38:30

标签: javascript arrays memory memory-management

  

可能重复:
  how to empty an array in JavaScript
  Best way to deallocate an array of array in javascript

我有一个对象数组:

var arr = [complexObj1, complexObj2];

如果我想清除阵列并确保没有内存泄漏,请执行以下操作吗?

arr.length = 0;

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

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

4 个答案:

答案 0 :(得分: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以从节点中删除事件侦听器。

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

答案 1 :(得分:1)

重新初始化数组:

arr = [];

答案 2 :(得分:0)

你需要做的只是

arr = null

答案 3 :(得分:0)

这样的东西
var t = myArray;
delete myArray;
//or
myArray = null;