2009-12-04 8 views
32

Si crea un elemento dentro de una función como:Javascript: document.createElement ('') y eliminar DOMElement

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

Y no lo añaden en cualquier parte de las funciones DOM es decir, a través de .appendChild, lo hace todavía permanecen en la memoria? Así que usted tendría que hacer

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

Tengo curiosidad :)

+11

Debe limpiarse con cualquier otra variable en el ámbito de la función. – Rob

+1

@Rob - esa debería ser una respuesta :) – Quentin

Respuesta

26

Se puede variar de un navegador a otro sin embargo el javascript delete palabra clave tiene nada que ver con el método del DOM createElement. No es necesario usar delete.

Lo que sucederá es que la referencia al elemento que se encuentra actualmente en el createdElement recibirá basura recolectada. Ahora, en el caso de IE eso significará que el elemento tendrá su conteo de referencia reducido a 0 por lo que se destruirá a sí mismo y liberará su memoria. Otros navegadores hacen las cosas de manera diferente, típicamente los elementos en el DOM son en sí mismos objetos recolectados y se eliminarán durante el mismo (o quizás un DOM específico) ciclo de GC.

Si el elemento se ha agregado al documento, en el caso de IE, se agregará otra referencia al elemento, de modo que cuando se elimine la referencia en createdElement, el elemento tendrá aún un recuento de referencia distinto de cero y continuará existe.

En el caso de otros navegadores donde los elementos en sí son basura, el elemento no se recogerá ya que el recolector lo vería en el gráfico de los objetos conectados al documento.

+1

Además, si una declaración de función apareciera después de 'createElement' refiriéndose al elemento creado, crearía un cierre alrededor del elemento. La recolección de basura del elemento se volvería dependiente de que la función se recolectara como basura, con o sin inserción en el 'documento'. –

+3

@Cresent: Bueno, una referencia a la función tendría que colocarse en algún lugar fuera del contexto de ejecución actual antes de que se forme un cierre. Sin embargo, la función ni siquiera tendría que hacer referencia a la variable que contiene el elemento para que exista una referencia circular, el hecho de que tanto la variable como la función existan en el mismo contexto de ejecución es suficiente para hacer eso. – AnthonyWJones

+0

Si alguien lo hace: función makeDomElement() { var DOMifier = document.createElement ('div'); DOMifier.innerHTML = "

"; } El oyente se adjuntará y mantendrá esto en la memoria. Tengo un método que toma cualquier cadena (que podría contener html) y utiliza el analizador DOM incorporado para identificar solo los nodos de texto. Sin embargo, no necesito mantener los objetos DOM analizados. Me temo que si una cuerda se puede unir al DOM, tendré una filtración. –

11

Después de que la función termina, ya no hay ninguna referencia al objeto, es decir, si el recolector de basura funciona correctamente, debe recopilarse (existe un error de IE que impide recopilar referencias circulares si se trata de nodos DOM) .

Además, su código está roto ya que las variables locales no se pueden eliminar: intentar hacerlo arrojará incluso un error de sintaxis en el modo estricto ES5.

Cuestiones relacionadas