深入浅出Javascript:対象に向けたクローズド


閉包を理解する
概念
クローズドとは、別の関数のスコープにアクセスする権限を持つ変数の関数です.
関数式のクローズド(内部にデータを保存し、外部に副作用がない)
作成方法
関数の内部に別の関数を作成します.
原理
一般関数:outer()で実行し終わったら、局部変数localが破壊され、メモリはグローバルスコープだけ保存されます.
function outer() {
    var localVal = 30;
    return localVal;
}
outer(); // 30
クローズド:outer実行後、func()は依然としてouter()内部のlocalValにアクセスできます.func()はouter()の内の活動対象(localVal)をFnc()の作用領域チェーンに追加するためです.outer()が実行した後、localValはfunc()の作用するドメインチェーンによって引用されたので、local Valは破壊されないで、メモリの中に存在して、func()が破壊されるまで、廃棄されます.
function outer() {
    var localVal = 30;
    return function() {
        return localVal;
    }
}
var func = outer();
func(); // 30
クローズドの応用
  • 傍受事件
  • !function() {
        var localData = "localData here";
        document.addEventListener('click',
            function() {
                console.log(localData);
            }
        );
    }();
  • ajaxイベント
  • !function() {
        var localData = "localData here";
        var url = "http://www.baidu.com/";
        $.ajax({
            url: url;
            success: function() {
                console.log(localData);
            }
        });
    }();
    誤った使用
    ループ
    クローズドパッケージ関数を使用すると、プライベート変数の使用が容易になります.
    包みの善し悪し
  • 利点:フレキシブルで便利なパッケージ
  • デメリット:空間浪費、メモリ漏れ(循環参照)、性能消耗