1. Qu'est-ce qu'une fermeture et la chaîne de portée impliqués dans la fermeture ne seront pas discutées ici.
2. Mécanisme de collecte des ordures javascript
JavaScript n'a pas besoin de mémoire manuellement libre, il utilise un mécanisme de collecte automatique automatique. Lorsqu'un objet est inutile, c'est-à-dire qu'aucune variable dans le programme se réfère à l'objet, la variable sera libérée de la mémoire.
La copie de code est la suivante:
var s = [1, 2,3];
var s = null;
// De cette façon, le tableau d'origine [1, 2, 3] sera publié.
3. Recycler la citation
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 l'attribut de B. Si A est effacé, alors B et C sont également libérés.
Aàbàcàb: un certain attribut de C est ajouté ici pour se référer à l'objet B. Si cela veut 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.
La copie de code est la suivante:
var a = {};
a.pro = {a: 100};
a.pro.pro = {b: 100};
a = null;
// Dans ce cas, {a: 100} et {b: 100} sont également publiés en même temps.
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var deux = obj.pro.pro;
obj = null;
// Dans ce cas, {b: 200} ne sera pas publié, tandis que {a: 100} sera publié.
4. Recycler les références et les fermetures
La copie de code est la suivante:
fonction outer () {
var obj = {};
fonction inner () {
// L'objet OBJ est référencé ici
}
obj.inner = intérieur;
}
Ceci est une sorte de référence circulaire cachée. Lorsque l'extérieur est appelé une fois, deux objets OBJ et intérieurs sont créés à l'intérieur. La propriété intérieure d'Obj fait référence à l'intérieur; Un intérieur similaire fait également référence à l'OBJ, car OBJ est toujours dans l'environnement fermé de Innerfun. Pour être précis, cela est dû à la "chaîne de portée" unique de JavaScript.
Par conséquent, les fermetures sont très faciles à créer des références circulaires, et heureusement, JavaScript peut très bien gérer de telles références circulaires.
5. Fuite de mémoire dans IE
Il y a plusieurs fuites de mémoire dans IE, et il y a une explication détaillée ici (http://msdn.microsoft.com/en-us/library/bb250448.aspx).
Une seule d'entre elles est discutée ici, à savoir les fuites de mémoire causées par des références circulaires, car c'est la situation la plus courante.
Lorsqu'il existe une référence de boucle 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 de boucle. Ce bug a été corrigé dans IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
"IE 6 a souffert de fuites de mémoire lorsqu'une référence circulaire entre plusieurs objets, parmi lesquels au moins un nœud DOM, a été créé. Ce problème a été résolu dans IE 7."
Si OBJ dans l'exemple ci-dessus (point 4) ne fait pas référence à un objet de fonction JavaScript (intérieur), 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.
La copie de code est la suivante:
fonction init () {
var elem = document.getElementById ('id');
elem.onclick = function () {
alert ('rain-man');
// L'élément Elem est référencé ici
};
}
Elem fait référence à la fonction d'écoute de son événement de clic, et la fonction fait également référence à l'élément Elem via sa chaîne de portée. De cette façon, même si vous quittez la page actuelle dans IE, ces références circulaires ne seront pas publiées.
6. Solution
La méthode de base consiste à effacer manuellement cette référence circulaire. Ce qui suit est un exemple très simple. Lorsque vous l'utilisez, 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.
La copie de code est la suivante:
fonction outer () {
var one = document.getElementById ('one');
one.OnClick = function () {};
}
window.onunload = function () {
var one = document.getElementById ('one');
one.onclick = null;
};
Autres méthodes (par: Douglas Crockford)
La copie de code est la suivante:
/ **
* Itérer à travers un certain nœud d'élément et tous les éléments descendants
*
* @param elem nœud le nœud d'élément à effacer
* Fonction Fonction de fonction @param pour le traitement
*
* /
fonction WalkheDom (nœud, func) {
func (nœud);
node = node.firstChild;
while (node) {
Walkhedom (nœud, func);
node = node.nextsibling;
}
}
/ **
* Effacer toutes les références du nœud DOM pour éviter les fuites de mémoire
*
* @param elem nœud le nœud d'élément à effacer
*
* /
fonction purgeeventHandlers (node) {
WalkTheDom (nœud, fonction (e) {
pour (var n dans e) {
if (typeof e [n] ===
'fonction') {
e [n] = null;
}
}
});
Ce qui précède est le contenu et les solutions pertinents pour les fuites de mémoire JavaScript. Les amis qui en ont besoin peuvent y faire référence.