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

変数・関数のスコープ

  • スコープはグローバルとローカルの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オブジェクトに属する

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

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

Last-modified: 2011-07-14 (木) 19:45:52 (2081d)