2012-03-25 10 views
-5

I've found that all of these scripts, while doing the same thing create memory leaks、質問は、なぜですか?メモリリークを引き起こすIE6での循環参照

循環参照が原因であるようです。

<script> 
function runme() { 
    var node = document.createElement("div"); 
    node.onclick = function() { 
    node.style.background = "red"; 
    } 
    document.body.appendChild(node); 
} 
</script> 

または

<script> 
function runme() { 
    var node = document.createElement("div"); 
    node.onclick = function() {} 
    document.body.appendChild(node); 
} 
</script> 

または

<script> 
var node = document.createElement("div"); 
document.body.appendChild(node); 
function runme() { 
    node.onclick = function() {} 
} 
</script> 

または

<script> 
var node = document.createElement("div"); 
node.onclick = empty; 
document.body.appendChild(node); 
function empty() { 
} 
</script> 
+5

これまでに何を発見しましたか? – dldnh

+4

IE6? IE6 ?! ** IE6?!?!** –

+0

私はすべてがそうであることを発見しました。しかし、私は理由を知らない。 –

答えて

0

私はあなたがリークを検出する方法を知っているが、私だけ最初の2例はありません漏れを作成します(を使用して検出されます)。 0)

理由:runme()内でノードのクロージャを作成します。

あなたはすべての4例に漏れを得たとき、あなたはノード(漏れがoccuresたときにそれがポイントだ)しかし

を削除する方法、表示される必要があります。解決策は、要素を削除する前に、イベントを削除することです:http://www.crockford.com/javascript/memory/leak.html