クロスブラウザなイベント登録の効率とか:自分自身を書き換える関数

JavaScriptのイベントリスナーの話 - public static void main
勉強会補足 - about:blank
Re: イベントリスナーの話 - hogehoge @teramako

無名関数でブラウザごとに振り分けられた関数を作成しておくTipsは最近意識して使うようにしているのだけど、今度はこれを使うとその関数を使わなくても常に関数を作成する処理が動くことが気になった(ふと思った程度だけど)。
addListenerを使うかどうかに関係なく、ブラウザはページを表示する(Scriptを読み込む)たびに律儀にaddListenerを作成するのがなんかもったいない気がすると。

じゃあ、1回目が実行された時点で自分自身を書き換えてみるというのはどうだろうと思って、ちょっと試してみた。


とりあえず、ベタに書いたのはこんなの。

function addEvent(target,type,listener,useCapture) {
  var func;
  if (window.addEventListener) {
    func = function(target,type,listener,useCapture){
      target.addEventListener(type,listener, useCapture);
    }
  } else if (window.attachEvent) {
    func = function(target,type,listener){
      target.attachEvent('on'+type,listener);
    }
  } else {
    func = function(target,type,listener){
      target['on'+type] = listener;
    }
  }
  func(target,type,listener,useCapture);
  addEvent = func;
}
  1. 1度目の呼び出しでは、適切なfuncを作成しそのfuncを実行、その後addEventを書き換え
  2. 2度目からはfuncが直接呼ばれるようになる

という仕組みです。
本当はarguments.calleeで何とかできないかなと思ってたのだけど、やり方がまずいのかどうもうまくいかなかった。


うーん、アイディアとしては悪くないと思うんだけど、もう少し洗練しないとね。がんばります。。