- 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 件のコメント:
コメントを投稿