匿名関数を使ってスコープを限定することが分かって思いついたのが、
if (true) {
//何かいろいろ
}
とすればいいのでは?
ということで試してみる。
if (true) {
var msg = 'zzz';
alert(msg);
}
alert(msg);
↑を実行すると、1回目にzzzが表示されるのは当然ですが、2回目もzzzが表示されます。つまり、if文のブレスの中はローカルスコープにならないらしい。
・・・
そこで、次のようにしてみた。
if (false) {
var msg = 'zzz';
alert(msg);
} else {
alert(msg);
}
↑を実行すると、undefinedが表示されます。if文はfalseの判定だが、trueの中の変数宣言だけ(初期化はされない)は生きているらしい。
・・・
さらに次のようにしてみる。
alert("msg1: " + msg1);
msg1 = 'zzz';
alert("msg1: " + msg1);
if (false) {
var msg1 = 'Ozzz';
alert("msg1: " + msg1);
}
ぱっと見では、msg1は宣言されていないためスクリプトエラーとなりそうなのだが、結果は「undefined」、「zzz」と2回表示されます。
if (false){}内のvar msg1宣言がなければスクリプトエラーとなるが、とにかくこのスコープ内にvar宣言があれば、あたまからその変数が使える。
当初はvar宣言の後方で変数が使えると思ったが、スコープの先頭からundefinedの値として使えるみたいです。おそらくパス1で変数宣言のリストをピックアップして、パス2で実行しているような感じ。パス1はif文等の通る/通らないは関係なしにvar宣言のみを探している感じか。
で、そのスコープの単位が関数単位らしい。関数の外に出ると変数は宣言されていないことになる。
さらにvar宣言もいい加減で、同じ変数名で2回以上var宣言してもエラーとならない。
var msg1 = 'zzz';
alert("msg1: " + msg1);
var msg1 = 'zzz';
alert("msg1: " + msg1);
・・・
プロトタイプ型言語としては面白いけど、こんな言語を仕事では使いたくはないな。。。
プリプロセッサで危険なコードをチェックできればいいのかもしれんが。









