2011年2月2日水曜日

[メモ] [JavaScript] 関数、クロージャ

JavaScript 関数/クロージャ

  • JavaScriptの関数はオブジェクトであり、使用時にはインスタンスが生成される
  • 呼び出すごとにインスタンスが生成され、その参照を変数に格納して保持できる
  • 参照を保持した関数であっても、呼び出すごとにローカル変数は初期化される(ローカル変数の定義を通るから)
  • 関数内部で定義された関数の参照を関数外部で保持していれば、外側の関数のインスタンス、ローカル変数の値も破棄されない
  • 保持している内部関数を呼び出しても、外側の関数のローカル変数は初期化されない(外側の関数の変数定義を通らないから)
  • それによりクロージャを再現している


こんなイメージかな~

  • var c で無名関数を参照している間は関数aのインスタンスも保持される
  • var c で無名関数を呼び出しても、関数aが新たに呼び出されない限りは、var iの値は保持される
  • したがってクロージャを再現できる


                 +----------------------------+
                 |   function a(param1){      |
                 |        var i=param1;       |
var c ------------------->return function(){  |
                 |            i++;            |
                 |            return i;       |
                 |        };                  |
                 |   }                        |
                 +----------------------------+


function a(param1) {

    // 関数aのローカル変数
  var i=param1;

    // 関数aのローカル変数iをインクリメントして返す無名関数を返す
  return function() {
  i++;
  return i;
  };
}


// 関数aを実行し、返ってきた内部の無名関数の参照を保持
var c = a(1);
// 保持した関数a内部の無名関数を実行
alert(c());
alert(c());


// 結果として
// 2
// 3
// と表示される

0 件のコメント:

コメントを投稿