static変数
static - 素人がプログラミングを勉強していたブログ
おもしろい。ただ、残念ながらIEやSafariでは期待通りに動かないらしい。しかし仕様ではこの通り動かないとダメだとか。
はてブコメントにあるクロージャを使った方法なら大丈夫のようだ。クロージャの具体的な使い道をいまひとつ把握してなかったけど、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; }; })();
今度は問題ないだろうか……。関数定義でなく関数オブジェクトの代入になるので、定義位置には注意しなければならない。