2015-11-10 6 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. Поэтому var e, просто ссылается на него и не выделяет новую память. Правильно я или нет?

Спасибо

+0

В будущем, пожалуйста, не изменяйте свой вопрос таким образом, чтобы он недействил существующие ответы. Стремитесь сделать свой вопрос точным * до * вы публикуете его. Если вы осознаете, что вам нужно изменить свой вопрос * после того, как вы написали ответы, а затем опубликуйте новый вопрос. – Matt

ответ

2

document.getElementById('div_id') не будет выделять память для элемента, так как он уже существует в дереве документа.

Тем не менее, статья, которую вы связали, фактически не говорит о том, что память будет выделена. Поэтому я не вижу ничего плохого в этой статье.

Единственное выделение памяти для переменной e выражения var e = document.getElementById('div_id');. Это распределение происходит в стеке. Новая ссылка на элемент присваивается 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: Release, когда память больше не требуется

Большинство проблем управления памятью приходят на этом этапе. Самая сложная задача здесь - найти, когда «выделенная память больше не нужна». Часто разработчику требуется определить, где в программе такая часть памяти больше не нужна и освобождает ее.

Смежные вопросы