8
votes

Fuites de mémoire JavaScript: Pourquoi assignerait-il un objet à Null Travail?

Quelqu'un peut-il gratter une démangeaison pour moi en ce qui concerne la nature du correctif affectant-null utilisé pour empêcher les fuites de mémoire?

Nous connaissons tous la technique suivante pour arrêter la référence circulaire entre l'objet DOM et le JS Object, afin d'empêcher les fuites de mémoire: p> xxx pré>

La question est de savoir pourquoi ce qui serait le travail ci-dessus? Réglage "ELE" à NULL arrêtera définitivement les références circulaires, mais cela n'empêcherait-il pas également les références futures à "ELE"? P>

var obj = {};
obj.method = function() {};

var objRef = obj; 

obj = null;  

//The Javascript Engine calling objRef.method when event triggered.


1 commentaires

J'ai édité ma réponse pour répondre à votre édition.


3 Réponses :


0
votes

Etant donné que vous obtenez ene en premier lieu en appelant document.getelementByID ("andréadique") , l'objet que les références utilisées existe déjà en mémoire avant d'attribuer ELE . C'est une partie du document - bien sûr, il y en a une référence dans la mémoire autre que ELE .


0 commentaires

7
votes

Trashing toutes les anciennes réponses, et aborder la modification :)

Prenons un exemple plus facile: TextContent code>. p>

var a = {};
var b = a;
b.foo = function() { console.log("hello world!"); };
console.log(a.foo + " is the same as " + b.foo);
b = null;
console.log("Even though b is " + b + ", a.foo is still " + a.foo);
a.foo();


1 commentaires

Je pense que vous pouvez expliquer la fermeture plus simplement que cela. Une fermeture est formée par une fonction interne ayant accès aux variables et paramètres d'une fonction extérieure. L'objet variable de la fonction externe (qui contient toutes ses variables et paramètres locaux en tant que propriétés) se trouve sur la chaîne d'application de la fonction interne. L'identifiant résolution suit le modèle typique de la vérification de l'objet de variable local, puis de la prochaine sur la chaîne d'étendue (la fermeture), puis de l'autre jusqu'à ce que l'objet global soit atteint.



1
votes

Je suis loin d'un gourou JavaScript; Mais je pense que je peux au moins partiellement répondre à votre question simplement en vous rappelant la différence entre une variable variable em> et un objet em>. Passons à travers votre code une ligne à la fois.

console.log("accessing ele ... after set to null " + ele.onclick);
  • déclarant une variable em> ( ELE code>) li>
  • attribution d'une référence à un élément DOM (un objet em>) à cette variable li> ul>

    Suivant: p> xxx pré>

    ici Nous utilisons la variable em> el code> pour attribuer un rappel à Le onclick code> de l'objet em> (à nouveau, un élément DOM) qu'il références. p>

    Enfin: P>

    ele = null;
    


0 commentaires