クロージャのまとめ(2) : JavaScript

Pocket

クロージャーの覚書。

クロージャーを大まかに分類。クロージャーとは意味はクロージャのまとめ(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

関連記事

» クロージャのまとめ(1) : JavaScript”>クロージャのまとめ(1) : JavaScript

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。