在阅读关于内存管理的MDN文章(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management)时,我遇到了以下问题:说出来是对的
var e = document.getElementById('div_id');
分配 DOM元素?我在MDN文章中使用了相同的单词。在我看来这是不正确的,因为id =“div_id”的元素对象已经在内存中作为DOM树的一部分创建。因此var,只是引用它并且不分配新的内存。我是对还是不对?
谢谢
答案 0 :(得分:2)
document.getElementById('div_id')
不会为元素分配内存,因为它已存在于文档树中。
但是,您链接的文章实际上并未说明将分配内存。所以我认为文章没有任何问题。
分配的唯一内存是表达式e
的变量var e = document.getElementById('div_id');
。这种分配发生在堆栈中。对该元素的新引用被分配给e
,这会占用内存(即使它的数量非常少)。堆中没有新的内存分配。
答案 1 :(得分:1)
是的,document.createElement('div/any tag');
会创建新节点,因此必须为其分配内存。
我猜,文档中的内存管理正在讨论特定情况,如下所述。假设您创建了一个DOM元素
var myDom = document.createElement('dom'); //or consider array of dom objects
//attach dom objects to document using appendChild/insertBefore apis
//on some **event** you remove dom nodes from the document using removeChild api
但最后,如果您忘记了用于存储DOM节点的myDom
/ array object
未被释放,则DOM对象仍将存在于内存中,即使它们未附加到了博士。
因此,如果您认为DOM不再使用,请指定myDom = null
,这将使GC释放空间。
Doc:不再需要内存时发布
大多数内存管理问题都来自此阶段。最艰巨的任务 这里是找到"不再需要分配的内存"。 通常需要开发人员确定程序中的位置 不再需要这样的内存并释放它。