2015-11-10 38 views
-1

在讀取內存管理的MDN文章(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management)我來到了以下問題:那麼,是否可以說,內存分配和DOM元素

var e = document.getElementById('div_id'); 

分配 DOM元素?我正在使用與MDN文章相同的詞語。在我看來,這是不正確的,因爲id =「div_id」的元素對象已經作爲DOM樹的一部分在內存中創建。因此,只是引用它,並不分配新的內存。我是對還是不對?

謝謝

+0

未來,請不要編輯您的問題,使其無效現有的答案。力爭在發佈之前讓你的問題準確無誤。如果你確實意識到你需要改變你的問題,*你已經累積了答案,然後發佈一個新問題。 – Matt

回答

2

document.getElementById('div_id')不會爲元素分配內存,因爲它已經在文檔樹存在。

但是,您鏈接的文章實際上並沒有說將分配內存。所以我沒有看到這篇文章有任何問題。

獲得分配的唯一內存用於表達式var e = document.getElementById('div_id');的變量e。該分配發生在堆棧中。對該元素的新引用被分配給e,這會消耗內存(儘管數量非常少)。沒有新的內存分配在堆中發生。

+0

我很抱歉。我的意思是document.getElementById不是document.createElement。那麼,我是否認爲該對象已經存在於內存中? –

+0

@ILIAS我編輯了我的答案。希望這會讓你明白。 –

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 

但在最後,如果你忘記了myDom/array object你用來存儲DOM節點沒有釋放出來,對DOM對象將在記憶仍然存在,即使它們是不附於文件。

因此,如果您認爲DOM不再使用,請指定myDom = null,這將使GC釋放空間。

Doc:當不再

所需的內存大多數內存管理問題版本來在這個階段。最困難的任務 這裏是要找到何時「不再需要分配的內存」。 它通常需要開發人員確定程序 中的哪個部分不再需要,並將其釋放。