可能重复:
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];
答案 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;