javascript - 从 Javascript 数组中清除对象

标签 javascript arrays memory memory-management

<分区>

Possible Duplicate:
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];

?

最佳答案

如果数组由没有引用其他方法或 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 以从节点中删除事件监听器。

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

关于javascript - 从 Javascript 数组中清除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779028/

相关文章:

javascript - MicrosoftAjax.js 没有缩小有什么原因吗?

javascript - 在多维数组中拼接奇数/偶数但结果一两个奇数/数字炫耀

java - 如何查找数组中重复的元素?

c - 从 'strings' 访问未在变量中声明的字符 (C)

C语言: pointer returned by malloc() and casting

asp.net - 如何将动态生成的结果传递到打印友好的新窗口中

javascript - 将第三方 javascript 文件合并到 webpack 包中?

c - 传递一维数组、二维数组和指针数组

java - 如何正确将变量添加到数组?

C++ 基于栈的对象分配