2012-10-08 12 views
3

可能重复:
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

是的,我实际上已经阅读过[如何在Javascript中清空数组]的问题(http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript),其中这就是为什么我写arr.length = 0作为可能的解决方案。我问是否真的会触发JS垃圾收集如果对象不是简单的对象,如字符串和整数 –

回答

1

如果阵列由简单的对象,而不对其他引用方法或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 

} 

您现在循环访问对象的数组并调用发布以从节点中删除事件侦听器。

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

+0

真棒,谢谢! –

1

只是重新初始化数组:

arr = []; 
+0

根据http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in- javascript,这是不好的,不会工作... –

+0

这将初始化阵列 – Codesen

0

你需要做的只是

arr = null 
0

喜欢的东西

var t = myArray; 
delete myArray; 
//or 
myArray = null;