Modifiquei o exemplo de outra pessoa e acho que fica mais compacto assim! Parafraseando as palavras de outras pessoas, quando um objeto DOM contém uma referência a um objeto Js (como um manipulador de eventos), e esse objeto Js contém uma referência ao objeto DOM, uma referência circular é suficiente, portanto, sob isto, ocorreu um vazamento de memória . Clique em “Executar código” e abra o Gerenciador de tarefas para ver as alterações na memória. Testado em ie8 e ff respectivamente, nem é preciso dizer a diferença.
executar código
Copie o código do código da seguinte forma:
<html>
<cabeça>
<title>Vazamento de memória</title>
<estilo>
corpo{
preenchimento: 10px;
}
</estilo>
</head>
<corpo>
</body>
<roteiro>
varq = [];
var n = 0;
setInterval(função(){
push(makeSpan());
if(q.comprimento>=10){
var s = q.shift();
se(s){
s.parentNode.removeChild(s);
}
}
n++;
},10);
função makeSpan(){
var s = document.createElement("span");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=função(e){
s.style.backgroundColor="vermelho";
alerta(n);
};
retornar;
};
</script>
</html>
Então, como resolver isso em ie?
Ao excluir um nó, quebre manualmente a referência circular e altere ligeiramente o código setInterval interno da seguinte maneira:
Copie o código do código da seguinte forma:
setInterval(função(){
push(makeSpan());
if(q.comprimento>=10){
var s = q.shift();
se(s){
s.onclick = null; //A chave está aqui
s.parentNode.removeChild(s);
}
}
n++;
},10);