after
関数が返したページのソースを確認してみましたか? これ以上 body タグはありません - それはあなたのイベントリスナーに行きます (または、まだメモリ内にあり、無駄にぶら下がっている可能性があります)。
に付けてみてくださいwindow
。
window.onresize = function()
{
document.write((this.innerWidth/this.innerHeight)*100+'%');
};
以前は非常に人気があったブラウザの古いバージョンでは、これ (ウィンドウ オブジェクトにイベント リスナをアタッチすること) がメモリ リークを引き起こします。ウィンドウ オブジェクトが実際に破棄されることはありません。詳細については、必要に応じてこちらを参照してください。
メモリの問題を解決するには?
(function(win)
{
win.onresize = function()
{
document.write((this.innerWidth/this.innerHeight)*100+'%');
};
if (win.attachEvent)
{
win.attachEvent('onbeforeunload',(function(self)
{
return function freeMem()
{
self.onresize = null;
self.detachEvent('onbeforeunload',freeMem);
};
})(win));
return;
}
win.addEventListener('beforeunload',(functio(self)
{
return function freeMem()
{
self.onresize = null;
self.removeEventListener('beforeUnload',freeMem,false);
};
})(win),false);
})(this);//this points to current window
私は知っています、ひどいように見えますが、私はこれをテストしました、そしてそれはそのトリックを行います-そのIEに感謝します。厳密に言えば、に渡すクロージャーwin
はself
省略できますが、onbeforeunload
イベントが発生し、ハンドラーがすべての関数を返し、参照が範囲外になるとすぐに、絶対に確実にするためにそこに保持します。そのため、GC は解放しない理由がありません。想い出。
ほとんどの場合、やり過ぎですが、誰かが気になる場合に備えて、ここに投稿することにしました... :-P