Ce que je comprends, la gestion de la mémoire en javascript est accompli par comptage de référence - tout une référence à un objet existe toujours, il ne sera pas libéré. Cela signifie que la création d'une fuite de mémoire dans une page unique application est trivial, et peut aller jusqu'à ceux de l'utilisation à venir de java arrière-plan. Ce n'est pas spécifique à JQuery. Prenez le code suivant par exemple:
function MyObject = function(){
var _this = this;
this.count = 0;
this.getAndIncrement = function(){
_this.count++;
return _this.count;
}
}
for(var i = 0; i < 10000; i++){
var obj = new MyObject();
obj.getAndIncrement();
}
Il a un aspect normal jusqu'à ce que vous regardez à l'utilisation de la mémoire. Les Instances de MyObject ne sont jamais libérées pendant que la page est active, en raison de la "_ce" pointeur (augmentation de la valeur max de j'voir plus de façon spectaculaire.). (Dans les anciennes versions d'IE, ils n'ont jamais été libéré jusqu'à ce que le programme s'arrête.) Depuis les objets javascript peut être partagée entre les images (je ne recommande pas d'essayer cela comme il est très capricieux.), il y a des cas où, même dans un navigateur moderne des objets javascript peut traîner beaucoup plus que ce qu'ils sont censés le faire.
Dans le contexte de jquery, les références sont souvent stockées pour économiser les frais généraux des dom de la recherche - par exemple:
function run(){
var domObjects = $(".myClass");
domObjects.click(function(){
domObjects.addClass(".myOtherClass");
});
}
Ce code tiendra à domObject (et tout son contenu) pour toujours, à cause de la référence à la fonction de rappel.
Si les auteurs de jquery ont manqué cas comme celui-là à l'interne, puis la bibliothèque elle-même est une fuite, mais le plus souvent, c'est le code du client.
Le deuxième exemple peut être fixe explicitement de compensation du pointeur lorsqu'il n'est plus nécessaire:
function run(){
var domObjects = $(".myClass");
domObjects.click(function(){
if(domObjects){
domObjects.addClass(".myOtherClass");
domObjects = null;
}
});
}
ou de faire la recherche de nouveau:
function run(){
$(".myClass").click(function(){
$(".myClass").addClass(".myOtherClass");
});
}
Une bonne règle de base est d'être prudent lorsque vous définissez vos fonctions de rappel, et d'éviter trop de nidification où c'est possible.
Edit: Comme l'a souligné dans les commentaires par Erik, vous pouvez également utiliser ce pointeur pour éviter la unnescessary dom recherche:
function run(){
$(".myClass").click(function(){
$(this).addClass(".myOtherClass");
});
}