変数あれこれ

とりあえず、

変数の型は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

というふうに、

Java使いは注意が必要

Java使いにとって馴染みのあるブロックスコープはまったく効果なし。
知らないでやってたらはまるとこだった。

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ブロックスコープの代わりに使うこともできそう。

ということで

ローカル変数でも関数内では一意な識別子が安全てことです。
ただ、グローバル変数よりはましなので、なるべくローカル変数を使うのがよさげ

蛇足

一度数値として宣言したあとに文字列を入れることもできるみたい。
ただ、お勧めはできないので、できるよってことだけ。