関数内 static 変数もどきをつくってみる

ひさびさにプログラミングな話で。JavaScriptで関数内static変数みたいなのを作ってみる。

オブジェクト指向言語におけるstatic変数は関数やブロック内で宣言された変数で、そのブロックが終了しても値を保持している変数のこと。それっぽいのを作ってみる。

var hoge = function () {
   if(!arguments.callee._staticValue){ arguments.callee._staticValue = 1; }
   return arguments.callee._staticValue++;
}
hoge();   // 1
hoge();   // 2
hoge();   // 3
hoge._staticValue;  // 3 (外部からアクセスできてしまう)

もちろん、この実体はstatic変数でも何でもなくて、単なる関数オブジェクトのプロパティなので外部からでもアクセスできてしまうが、グローバル変数を定義するぐらいならこちらを使った方がいいんじゃない?

利用法としては、例えば複数のボタンに対して一つの関数をイベントリスナとし、最後にそのリスナを実行したボタン(のDOM要素)を関数自身に記憶させるとか。

// require jQuery
function onclickHoge( event ) {
    arguments.callee.lastEventTarget = event.target;
    // 何か処理
}
$("input.hoge").click(onclickHoge);
 
// onclickHogeイベントリスナを最後に実行した要素を取得
var element = onclickHoge.lastEventTarget;

イベントリスナを最後に実行したDOM要素をイベントリスナ自身に記憶させて、それを外から取り出して何かごにょごにょできる。ネーミングを工夫するとonclickHoge.lastEventTargetのように美しく取得できて良い感じ。