Javascriptでイベントハンドラのコールバック関数に引数を渡す

javascriptでゴリゴリコードを書いていると、最近のライブラリではコールバック関数を渡すのがけっこう日常茶飯事なようで、コールバック関数を渡すのはいいが、その関数に引数を渡してあげたい!!ってことがよくあるのですよ。
今までなんとか引数は諦めてしのいでたけど、どうも納得がいかないんで調べてみた。

例えばとあるボタンのイベントハンドラで、クリックした際にhogeというfunctionが実行されるようにしたいってな場合は、こんな感じで書きます。

  var hoge = function(evt) {
    alert("hogehoge" + evt);
  }

  btn3 = document.getElementById("btn3");
  btn3.addEventListener("click", hoge, true);

しかしこの「addEventListener」に引数を渡したくて、こんなん書いてみると。。。。

btn3.addEventListener("click", hoge('msg1'), true);

オンロード時に関数hogeが実行されてしまって、イベントハンドラに登録されてねぇよ〜なんて状態になってしまいます。

え〜、コールバック関数に引数ば渡せんやん!って思いつつ検索してたら、同じ悩みの人を発見!!(ActionScriptみたいだけど、、、)

addEventListenerで一緒に引数を渡したい -- apeirophobia --

まぁ、基本ECMAScriptなんで、似たような感じでコードを書いてみる。

パターンその1

function action1(ev, msg1, msg2) {
  alert("event=" + ev);
  alert("msg1=" + msg1 + ", msg2=" + msg2);
}

btn1 = document.getElementById("btn1");
btn1.addEventListener("click", function(ev){action1(ev, 'hoge1', 'hoge2')}, true);

パターンその2

ちょっと呼び出し先の定義が複雑にはなるけど。こっちのほうがハンドラに記述するときはしっくり来るな〜。

function action2(msg1, msg2) {
  return function(ev) {
    alert("event=" + ev);
    alert("msg1=" + msg1 + ", msg2=" + msg2);
  }
}

btn2 = document.getElementById("btn2");
btn2.addEventListener("click", action2('hoge1', 'hoge2'), true);

というわけで、イベントハンドラのコールバック関数に引数を渡すことができましたとさ。