変数・関数のスコープ
var foo = 1; function myfunc1() { alert(foo); // 1 bar = 2; var baz = 3; } function myfunc2() { alert(bar); // 2 alert(baz); // bazはmyfunc1()の中のローカル変数なので表示されない } myfunc1(); myfunc2(); グローバル変数はwindowオブジェクトに属するvar foo = 1; alert(window.foo); // もしくはwindow["foo"] 関数内で宣言された変数は、関数のどこで宣言していても、関数先頭で宣言した事と同じ関数内で宣言された変数は、関数のどこで宣言していても、関数先頭で宣言した事と同じになる。これをvar宣言の巻き上げ(hoisting)と言う。 var foo = 1 function myfunc() { alert(foo); // Undefined (1) var foo = 2; alert(foo); // 2 (2) } myfunc(); (1)でグローバル変数fooを参照しないのは、その下の行でローカル変数fooを宣言しているから。(1)のfooと(2)のfooは同じローカル変数を参照している事になる。従って、上のコードは下のコードと動作が等しい。 var foo = 1 function myfunc() { var foo; alert(foo); foo = 2; alert(foo); } myfunc(); 関数のネストfunction outer() { function inner() { return "INNER"; } return inner(); } outer(); // => "INNER" inner(); // => エラー発生 クロージャfunction counter() { var n = 0; return function () { return n++; } } var c = counter(); alert(c()); // 0 alert(c()); // 1 alert(c()); // 2 |
|