tmlibの練習ブログ

自分流にtmlibを触っていきます。分かったことを解説。入門用になれば…?

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を付けて、スコープを縮めるようにしよう。