清除Javascript数组中的对象
清除Javascript数组中的对象
这个问题已经在这里有答案了:
可能是重复的问题:
我有一个对象数组:
var arr = [complexObj1, complexObj2];
如果我想要清除该数组并确保没有内存泄漏,下面的代码是否可以?
arr.length = 0;
或者我需要遍历我的数组并调用类似下面的代码:
complexObj.release(); or arr[0] = null; or delete arr[0];
?
admin 更改状态以发布 2023年5月21日
如果数组由简单对象组成,并且没有与其他方法或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来从节点中删除事件监听器。
这是我认为人们通常会错过的一个简单示例。它不必是事件处理程序,但可以是任何被复杂对象之外引用的东西。