クロージャーの覚書。
クロージャーを大まかに分類。クロージャーとは意味はクロージャのまとめ(1) : JavaScriptを参照。
// クロージャーは変数名解決の環境を保持する。 // そのためクロージャーは参照できる必要がある。 // 参照の可能性がないものはガーベージコレクションされる。 // クロージャーではない単なる関数 // 呼び出し元に何も返らないので // 関数hogeを抜けた時点で変数var,incはガーベージコレクションされる function hoge() { var count = 0; function inc() { return count++; } inc(); // incを実行 } var hoge1 = hoge(); console.log(hoge1); // undefined // 典型的なクロージャー // 関数を返す // 変数名解決の環境を保持する function foo() { var count = 0; // 自由変数 return function () { return count++; }; } var foo1 = foo(); var foo2 = foo(); console.log(typeof foo1); // function console.log(foo1()); // 0 console.log(foo2()); // 0 console.log(foo2()); // 1 console.log(foo1()); // 1 // オブジェクト型 // 明示的にobjectを返す function bar() { var count = 0; function _inc() { return count++; } return { inc: _inc }; } var bar1 = bar(); var bar2 = bar(); console.log(typeof bar1); // object console.log(bar1.inc()); // 0 console.log(bar2.inc()); // 0 console.log(bar2.inc()); // 1 console.log(bar1.inc()); // 1 // コンストラクタ // 明示的にはreturnされないが内部でインスタンスが返る function Baz() { var count = 0; function _inc() { return count++; } this.inc = _inc; } var baz1 = new Baz(); var baz2 = new Baz(); console.log(typeof baz1); console.log(baz1.inc()); // 0 console.log(baz2.inc()); // 0 console.log(baz2.inc()); // 1 console.log(baz1.inc()); // 1
» jsFiddle
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。