Javascript: document.createElement ('') и удалить DOMElement - PullRequest
42 голосов
/ 04 декабря 2009

Если вы создаете элемент внутри функции, такой как:

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
}

И вы нигде не добавляете его в DOM, т. Е. Через функции .appendChild, оно все еще остается в памяти? Так что вы должны сделать

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
   delete createdElement;
}

Мне просто любопытно :) 1007 *

Ответы [ 2 ]

33 голосов
/ 04 декабря 2009

Это будет варьироваться от браузера к браузеру, однако ключевое слово javascript delete не имеет ничего общего с методом createElement DOM. Нет необходимости использовать delete.

Что произойдет, так это то, что ссылка на элемент, который в настоящее время содержится в createdElement, будет собирать мусор. Теперь в случае IE это будет означать, что счетчик ссылок элемента будет уменьшен до 0, поэтому он уничтожит себя и освободит свою память. Другие браузеры работают иначе, как правило, элементы в DOM сами являются объектами сборки мусора и будут удалены во время того же (или, возможно, специфичного для DOM) цикла GC.

Если бы элемент был добавлен в документ, то в случае IE была бы добавлена ​​еще одна ссылка на элемент, поэтому при удалении ссылки в createdElement объект элемента все равно имел бы ненулевой счетчик ссылок и продолжал бы существовать.

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

11 голосов
/ 04 декабря 2009

После завершения функции больше нет ссылки на объект, т. Е. Если сборщик мусора работает должным образом, его следует собрать (есть ошибка IE, которая не позволяет собирать объекты с циклическими ссылками, если задействованы узлы DOM).

Кроме того, ваш код поврежден, поскольку локальные переменные не могут быть удалены: попытка сделать это даже приведет к синтаксической ошибке в строгом режиме ES5.

...