変数あれこれ
とりあえず、
変数の型は1つしかないので、
name = "pochi" _name = "pochi" names = new Array(5) // 配列 names = new Array("pochi","shiro") // 配列
スコープは
グローバル変数とローカル変数があって
name = "pochi"
ローカル変数
var name = "pochi"
基本的にはローカル変数で行きたいところ。
よほど、変数名が一意になる確信がない限り俺には使えない。
ローカル変数の罠
ローカル変数の場合にはブロックによってもスコープが区切られる。
と思いきや
function showLocalVar(){ var count1 = 1; alert("count1 = " + count1 + "\ncount2 = " + count2); // (1) { var count2 = 2; alert("count1 = " + count1 + "\ncount2 = " + count2); // (2) count1++; count2++; } alert("count1 = " + count1 + "\ncount2 = " + count2); // (3) }
(1)
count1 = 1
count2 = undefined
(2)
count1 = 1
count2 = 2
(3)
count1 = 2
count2 = 3
というふうに、
for文の場合も
例外なく
function showGlobalVar1(){ for (var i = 0; i < 10; i++) { } alert(i); }
出力結果は10となって、スコープの問題は全然解決されません。
functionでは?
javascriptでは関数の中で関数を宣言(生成?)することができるので、その場合はというと
function showLocalVar2(){ var count = 0; var f = function(x,y){ var msg = "hello"; count++; return x > y; } alert(f(4,5)); // (1) alert(count); // (2) alert(f(5,4)); // (3) alert(count); // (4) alert(msg); // (5) }
出力結果
false // (1) 1 // (2) true // (3) 2 // (4) (エラー)// (5)宣言されてません的なエラーが発生
というわけで、めでたくエラーになりました。
まぁ、ローカル変数がfunction内でのみ有効なことを考える当然でした。
ただ、上位の関数で宣言された変数は下位の関数でも有効なので、そう考えるとfunctionをJavaのブロックスコープの代わりに使うこともできそう。
ということで
ローカル変数でも関数内では一意な識別子が安全てことです。
ただ、グローバル変数よりはましなので、なるべくローカル変数を使うのがよさげ
蛇足
一度数値として宣言したあとに文字列を入れることもできるみたい。
ただ、お勧めはできないので、できるよってことだけ。