var 変数のvarって?(変数のスコープについて)
変数には、スコープというものが存在する。
これはその変数が、どこを過ぎるまで保存するか(どこを過ぎたら消去されるか)といったルール付けだ。
例えば、
var key = app.keyboard;
userData = tm.util.DataManager.get("userData");
これらで、疑問を抱かなかっただろうか?
1つ目の変数の前に付いた"var"は何だろう? と。
逆に言えば、なぜ2つ目に"var"は付けないのだろう?
実はこのvarという物で、スコープを決めている。
aaa = function(){ test = "neko";} aaa(); alert(test);
こう書いた時、きちんとalertで表示されたと思うが
(main.jsを別名で保存してから、全部消してこれを書いてindex.htmlを読めば、試せる)
aaa = function(){ var test = "neko";} aaa(); alert(test);
varを付けると、エラーになって実行されない。
実はvarは"自分のいるカッコ( { } )が終わるまでが、変数の有効期限ですよ"と決めている。
なので、var test = "neko";の方は、{ }から出た時に消えてしまい、
その外側でalertする時には、もはや存在しなくなっている。
逆にvarを付けないと原則、どこでも使える。
やや例外的なのが、
var SCREEN_WIDTH = 640; aaa = function(){ //色々... alert(SCREEN_WIDTH); } aaa();
のように、"そもそも{ }の中で書かれていない(一番外側で書かれた)var 変数"。
これは変数回収の目安となる、閉じカッコ( } )が存在しない…という事で、どこでも使える、という事に。
ただしあくまで回収されるのは、"自分が置かれた"{ }が閉じるまで。
なので
aaa = function(){ var test = "neko"; bbb = function(){ alert(test); } bbb(); } aaa();
この時、"aaaの内側にあるbbb"の中でも、testは使える。
(bbbを作った時、aaaはまだ閉じていない訳だから)
ついどこでも使えるよう、varを付けない(グローバル変数という)にしがちだけど、その内、どこで何を使っているのか分からなくなってしまう。
可能な限りvarを付けて、スコープを縮めるようにしよう。