2 votes

La mécanique de la mémoire avec la portée

Si je fais quelque chose comme

// global scope
function stuff() {
    // local scope
    var a = new SomeHugeMemoryHog();
}

// a doesn't exist down here, but what happened to the memory from the "stuff" scope?

Est-ce que je vais créer une fuite de mémoire si je ne mets pas a = null à la fin de la stuff scope ? Ou ne devrais-je pas inquiétude à ce sujet ? Je pose cette question dans l'optique de créer DOM (comme un canvas ) à l'intérieur de la portée des fonctions (que je n'utilise plus à aucun moment). Je n'utilise le canevas que pour saisir les dimensions des vecteurs.

3voto

Kevin Ennis Points 6061

Non, il doit être récupéré une fois qu'il n'y a plus de référence à lui.

3voto

chuckj Points 7975

Comme d'autres l'ont souligné, puisqu'il n'y a pas de référence à la a en dehors de la fonction, le ramasseur d'ordures le collectera, très probablement lors de la prochaine collecte.

Il faut cependant faire attention à certaines choses, comme la capture indirecte. Cela se produit souvent dans les gestionnaires d'événements par le biais de la capture de fermeture. Par exemple,

function stuff() {
    var a = new SomeLargeObject();
    $("#somediv").click(function () { /* something */ });
}

Même si la fonction imbriquée n'utilise pas la fonction a . a pourrait être maintenu en vie parce que l'enregistrement d'activation de stuff est toujours en vie. De plus, les objets DOM peuvent être collectés différemment des objets JavaScript normaux, ce qui peut les rendre sensibles aux références circulaires et causer des problèmes de collecte. Ceci est plus problématique dans les anciens navigateurs et puisque vous faites référence en utilisant un canevas, les navigateurs qui supportent le canevas ont tendance à être plus modernes et à gérer correctement les références circulaires ainsi qu'à permettre aux variables locales non capturées par une fermeture d'être collectées.

1voto

Marc B Points 195501

Tu ne devrais pas t'en inquiéter. a sera un global local dans la fonction stuff() (et visible pour tout code qui s'exécute "plus bas", mais ne sera pas visible en dehors de l'appel stuff().

par exemple

<script>
// a does not exist here

function stuff() {
   // no a here
   var a = new SomeHugeMemoryHog(); // a will be set once SomeHugeMemoryHog is created and the constructor returns
   // a exists here
}

// no a here either

stuff(); // a exists while stuff is running

// a has gone out of scope and will be cleaned up.

</script>

-1voto

shinkou Points 3392

Le seul cas où je vois une fuite de mémoire possible est lorsque votre fonction est utilisée comme constructeur.

var someObj = new stuff();

Sinon, la variable a sera collectée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X