web-dev-qa-db-fra.com

Javascript: document.createElement ('') & supprimer DOMElement

Si vous créez un élément dans une fonction comme:

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

Et vous ne l'ajoutez nulle part dans le DOM, c'est-à-dire via les fonctions .appendChild, reste-t-il toujours en mémoire? Alors tu devrais faire

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

Je suis juste curieux :)

46
Gary Green

Il variera d'un navigateur à l'autre mais le mot-clé javascript delete n'a rien à voir avec la méthode createElement du DOM. Il n'est pas nécessaire d'utiliser delete.

Ce qui se passera, c'est que la référence à l'élément actuellement contenu dans le createdElement récupérera les ordures. Maintenant, dans le cas de IE cela signifiera que l'élément aura son nombre de références tombé à 0 donc il se détruira et libérera sa mémoire. D'autres navigateurs font les choses différemment typiquement les éléments dans le DOM sont eux-mêmes des objets récupérés et seront supprimés pendant le même cycle GC (ou peut-être un DOM spécifique).

Si l'élément avait été ajouté au document, dans le cas de IE il y aurait une autre référence ajoutée à l'élément, donc lorsque la référence dans createdElement est supprimée, l'objet élément serait toujours ont un nombre de références différent de zéro et continuent d'exister.

Dans le cas d'autres navigateurs où les éléments eux-mêmes sont récupérés, l'élément ne sera pas collecté car le collecteur le verra dans le graphique des objets connectés au document.

36
AnthonyWJones

Une fois la fonction terminée, il n'y a plus de référence à l'objet, c'est-à-dire que si le garbage collector fonctionne correctement, il doit être collecté (il y a un bug IE qui empêche les objets avec des références circulaires d'être collectés si Les nœuds DOM sont impliqués).

De plus, votre code est cassé car les variables locales ne peuvent pas être supprimées: essayer de le faire entraînera même une erreur de syntaxe en mode strict ES5.

11
Christoph