Ich habe das Beispiel eines anderen modifiziert und finde, dass es so kompakter ist! Um die Worte anderer zu paraphrasieren: Wenn ein DOM-Objekt einen Verweis auf ein Js-Objekt (z. B. einen Event-Handler) enthält und dieses Js-Objekt einen Verweis auf das DOM-Objekt enthält, reicht ein Zirkelverweis aus, also unter ie Ein Speicherverlust ist aufgetreten . Klicken Sie auf „Code ausführen“ und öffnen Sie den Task-Manager, um die Speicheränderungen anzuzeigen. Getestet unter ie8 bzw. ff, ist der Unterschied selbstverständlich.
Code ausführen
Kopieren Sie den Codecode wie folgt:
<html>
<Kopf>
<title>Speicherleck</title>
<Stil>
Körper{
Polsterung: 10px;
}
</style>
</head>
<Körper>
</body>
<Skript>
var q = [];
var n = 0;
setInterval(function(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
wenn(s){
s.parentNode.removeChild(s);
}
}
n++;
},10);
Funktion makeSpan(){
var s = document.createElement("span");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=function(e){
s.style.backgroundColor="red";
alarm(n);
};
return s;
};
</script>
</html>
Wie kann man es also lösen?
Wenn Sie einen Knoten löschen, unterbrechen Sie den Zirkelverweis manuell und ändern Sie den darin enthaltenen setInterval-Code leicht wie folgt:
Kopieren Sie den Codecode wie folgt:
setInterval(function(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
wenn(s){
s.onclick = null;//Der Schlüssel ist hier
s.parentNode.removeChild(s);
}
}
n++;
},10);