清除Javascript数组中的对象

17 浏览
0 Comments

清除Javascript数组中的对象

这个问题已经在这里有答案了:

可能是重复的问题:

如何在JavaScript中清空数组

在JavaScript中释放数组的最佳方法

我有一个对象数组:

var arr = [complexObj1, complexObj2];

如果我想要清除该数组并确保没有内存泄漏,下面的代码是否可以?

arr.length = 0;

或者我需要遍历我的数组并调用类似下面的代码:

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

只需重新初始化数组:

arr = [];

0
0 Comments

如果数组由简单对象组成,并且没有与其他方法或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来从节点中删除事件监听器。

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

0