static変数

static - 素人がプログラミングを勉強していたブログ
おもしろい。ただ、残念ながらIESafariでは期待通りに動かないらしい。しかし仕様ではこの通り動かないとダメだとか。
はてブコメントにあるクロージャを使った方法なら大丈夫のようだ。クロージャの具体的な使い道をいまひとつ把握してなかったけど、static変数として使うのか……なるほど。
FF日記の方で作ってた小物を、この方法でちょっと改造してみた。表示切り替えの実装だけど、今までグローバル変数を使っていたのを、ローカルのクロージャに閉じ込めた。↓こんな感じ。

function tab_switcher (id) {
    var mode = (function () {
        var m;
        return function (id) {
            if (id) m = id;
            return m;
        };
    })();
    if (mode() == id) return;
    var ids = ['status', 'weapon', 'caution', 'howto'];
    for (var i=0; i<ids.length; i++) {
        $(ids[i]).style.display = "none";
    }
    $(id).style.display = "";
    calc();
    mode(id);
}

1つの関数からしか参照しない値なら、大概これで大丈夫そうだ。

追記

これ、意味ないね。ダメダメだ。このコードだとそもそもmodeを持っておく必要がないことに気付いてないのがダメだ。クロージャ以前の問題。頭が悪い。
そしてクロージャの利用例にもなっていないという……。クロージャにはなってるんだけど、作ったクロージャを毎回捨ててるから意味ない。

追記2

もし、modeを持ち、クロージャとして実装するなら、次のようになるだろう。

var tab_switcher = (function () {
    var mode;
    var ids = ['status', 'weapon', 'caution', 'howto'];
    return function (id) {
        if (id) {
            mode = id;
            for (var i=0; i<ids.length; i++) {
                $(ids[i]).style.display = "none";
            }
            $(id).style.display = "";
            calc();
        }
        return mode;
    };
})();

今度は問題ないだろうか……。関数定義でなく関数オブジェクトの代入になるので、定義位置には注意しなければならない。