var a = 1;//グローバル変数
function ftest(){
var a = 2;//ローカル変数
b = 3;//グローバル変数
}
ftest();
console.log(a);//1
console.log(b);//3
上の例では b はグローバル変数になる(恐ろしい)。
PHPではこうならないが、これはJavaScriptの昔からの仕様で、うっかり var を付け忘れると大変なことになる可能性がある。
関数内と外に同名の変数 a あるが、関数内の a は var を書いたので、この関数内で使えるローカル変数になり、グローバル変数の a とは別物。
もし var を書かず単に a = 2; とした場合はグローバル変数の a に 2 を代入することになるので、console.log(a) の結果は 2 になる。
var a = 1;
function ftest(){
var a = 2;
console.log(a);//2
console.log(window.a);//1
}
ftest();
上の例では、window.a はグローバル変数の方の a になり、関数内で使うことができる。
では、関数の引数はどうなるのか。
var a = [1, 2];
var b = 10;
function ftest(a, b){
b++;
a.push(b);
return a;
}
console.log(ftest(a, b));//Array [ 1, 2, 11 ]
console.log(a);//Array [ 1, 2, 11 ](Array [ 1, 2 ]ではない)
console.log(b);//10(11ではない)
function ftest(a, b) と書けば、基本的に変数 a, b を宣言したのと同じ。
ただし、配列など参照型の場合、上の例のように関数内の処理がグローバルに影響する。