我有一个对象数组:
var arr = [complexObj1, complexObj2];
如果我想清除数组并确保没有内存泄漏,下面会做吗?
arr.length = 0;
或者我是否需要遍历我的数组并调用类似:
complexObj.release(); or
arr[0] = null; or
delete arr[0];
?
我有一个对象数组:
var arr = [complexObj1, complexObj2];
如果我想清除数组并确保没有内存泄漏,下面会做吗?
arr.length = 0;
或者我是否需要遍历我的数组并调用类似:
complexObj.release(); or
arr[0] = null; or
delete arr[0];
?
如果数组由不引用其他方法或 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 以从节点中删除事件侦听器。
这是我认为人们通常会错过的一个简单示例。它也不必是事件处理程序,但可以是在复杂对象之外引用的任何内容。
只需重新初始化数组:
arr = [];
你需要做的只是
arr = null
就像是
var t = myArray;
delete myArray;
//or
myArray = null;