* 変数・関数のスコープ [#lc3fb2cd]

- スコープはグローバルとローカルの2種類。
- 変数のスコープは関数単位で、ブロックスコープではない。
- グローバル変数は、関数の外で宣言する。もしくは(関数の中であっても)varを付けずに宣言する。
- ローカル変数は、関数の中でvarを付けて宣言する。
- 関数は変数と同じスコープを持つ。

 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オブジェクトに属する [#g8b3e6d4]
 var foo = 1;
 alert(window.foo);  // もしくはwindow["foo"]

** 関数内で宣言された変数は、関数のどこで宣言していても、関数先頭で宣言した事と同じ [#id7813fe]
関数内で宣言された変数は、関数のどこで宣言していても、関数先頭で宣言した事と同じになる。
関数内で宣言された変数は、関数のどこで宣言していても、関数先頭で宣言した事と同じになる。これを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();

** 関数のネスト [#jf4ca0fd]
 function outer() {
     function inner() {
         return "INNER";
     }
     return inner();
 }
 
 outer(); // => "INNER"
 inner(); // => エラー発生

** クロージャ [#y3ac9778]
 function counter() {
   var n = 0;
   return function () {
     return n++;
   }
 }
 var c = counter();
 alert(c());  // 0
 alert(c());  // 1
 alert(c());  // 2

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS