Maison >interface Web >js tutoriel >Une discussion détaillée des compétences JavaScript en matière de fuites de mémoire_javascript
1. Qu'est-ce qu'une fermeture et la chaîne de portée impliquée dans la fermeture ne sera pas discutée ici.
2. Mécanisme de récupération de place JavaScript
JavaScript n'a pas besoin de libérer manuellement de la mémoire, il utilise un mécanisme automatique de récupération de place (garbage collection). Lorsqu'un objet est inutile, c'est-à-dire lorsqu'aucune variable du programme ne fait référence à l'objet, la variable sera libérée de la mémoire.
3. Référence circulaire
Trois objets A, B, C
AàBàC : Un certain attribut de A fait référence à B, et C est également référencé par un attribut de B. Si A est effacé, alors B et C sont également libérés.
AàBàCàB : Ici, un certain attribut de C est ajouté pour référencer l'objet B. Si cela doit effacer A, alors B et C ne seront pas libérés car une référence circulaire est générée entre B et C.
Par conséquent, les fermetures sont très faciles à créer des références circulaires. Heureusement, JavaScript peut très bien gérer de telles références circulaires.
Il existe plusieurs types de fuites de mémoire dans IE, et vous trouverez des explications détaillées ici (
http://msdn.microsoft.com/en-us/library/bb250448.aspx).
Un seul d’entre eux est abordé ici, à savoir la fuite de mémoire provoquée par référence circulaire, car c’est la situation la plus courante.Lorsqu'il existe une référence circulaire entre un élément DOM ou un objet ActiveX et un objet JavaScript normal, IE a des difficultés particulières à libérer de telles variables. Il est préférable de couper manuellement la référence circulaire. Ce bug a été corrigé dans IE. 7 (
http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
« IE 6 souffrait de fuites de mémoire lorsqu'une référence circulaire entre plusieurs objets, parmi lesquels au moins un nœud DOM, était créée. Ce problème a été résolu dans IE 7. ».
Si dans l'exemple ci-dessus (point 4) obj ne fait pas référence à un objet Fonction JavaScript (interne), mais à un objet ActiveX ou à un élément Dom, la référence circulaire formée dans IE ne peut pas être libérée.
Elem fait référence à sa fonction d'écoute d'événements de clic, qui fait également référence à l'élément elem via sa chaîne de portée. De cette façon, ces références circulaires ne seront pas publiées même si vous quittez la page actuelle dans IE.
6.Solution
La méthode de base consiste à effacer manuellement cette référence circulaire. Voici un exemple très simple. Dans une application réelle, vous pouvez créer vous-même une fonction addEvent() et effacer toutes les liaisons d'événements sur l'événement de déchargement de la fenêtre.
Autres méthodes (par : Douglas Crockford)