IE memory-leak problem 2

生成時間 ミリ秒

Model 2 — which doesn't leak

 この類は手短に済ませようとaddEvent関数内でクロージャー化したり匿名関数にしてしまうことが多いのですが、IEのメモリリークを防ぐには外に出す必要があります。こうすれば、F5ボタンやリロードボタンでリロードを繰り返しても生成時間はさほど変化なくメモリリークを起こしていないことが伺えます。

function addEvent(obj, evType, fn){
 if(!obj["_"+evType]){
  obj["_"+evType] = [];
  if(obj["on" + evType] != null) obj["_"+evType].push(obj["on" + evType]);
  obj["on" + evType] = evokeEvent;//このように関数外に出す
 } else for(var i in obj["_"+evType]) if(obj["_"+evType][i]===fn) return;
 obj["_"+evType].push(fn);
};

function evokeEvent(e){//このように関数外で定義
 var e = e || window.event;
 for(var i in this["_"+e.type]) this["_"+e.type][i].apply(this,[e]);
};