清除Javascript数组中的对象

Clearing objects from Javascript array

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
how to empty an array in JavaScript
Best way to deallocate an array of array in javascript

我有一组对象:

1
var arr = [complexObj1, complexObj2];

如果我要清除阵列并确保没有内存泄漏,下面的操作会执行吗?

1
arr.length = 0;

或者我是否需要遍历数组并调用如下内容:

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


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

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

1
2
3
4
5
6
7
8
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 = []重置数组。数组将被清除,但对象仍保留一个节点和一个活动事件处理程序,单击按钮时将触发该事件处理程序,这意味着对象无法从内存中删除。您刚从数组中删除了对它的引用。

您的第一个想法是正确的,因为您应该以某种方式"破坏"复杂的对象,并删除它持有的任何引用。

1
2
3
4
5
6
Complex.prototype.release = function() {
    this.node.removeEventListener('click',this.handler);
    delete this.handler;
    delete this.node

}

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

这是我认为人们通常会怀念的一个简单例子。它也不必是事件处理程序,但可以是复杂对象外部引用的任何对象。


只需重新初始化数组:

1
arr = [];


类似的东西

1
2
3
4
var t = myArray;
delete myArray;
//or
myArray = null;

你需要做的只是

1
arr = null