zorioの日記 このページをアンテナに追加 RSSフィード

2008-06-09

[] IE6のメモリリークを華麗に回避

ajaxian経由:http://ajaxian.com/archives/is-finally-the-answer-to-all-ie6-memory-leak-issues

http://www.hedgerwow.com/360/dhtml/ie6_memory_leak_fix/

try ... finallyを使って循環参照を削除する方法。

windowのunloadとかに頼らないで済む所がかっこいい。

function createButton() 
{
	var obj = document.createElement("button");
	obj.innerHTML = "click me";
	obj.onclick = function() {
		//handle onclick
	}
	//this helps to fix the memory leak issue
	try {
		return obj;
	} finally {
		obj = null;
	}
}
var dButton = document.getElementsById("d1").appendChild(createButton());

finallyが無いと、

  1. buttonのonclickプロパティにセットされたFunctionオブジェクト
  2. Functionオブジェクトの[[Scope]]プロパティにセットされたActivationオブジェクト
  3. Activationオブジェクトのobjプロパティにセットされたbutton

って感じで循環参照するのだが、finallyでobjにnullがセットされるので循環参照が回避される。

これで全部のケースを回避できるのかどうか良く分からないが、TopHatenarの終わりのほうに引っかかっている事に気付いたので久しぶりに書いてみた。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zorio/20080609/1213028969
Connection: close