クローズドとは何ですか?どうして使いますか?

2983 ワード

上のテーマです.変形します.
var x = 0;
var foo = {
    x:1,
    bar:function () {
        console.log(this.x);
        var that = this;
        return function () {
           console.log(this.x)
           console.log(that.x)
        }
    }
}


foo.bar()       // 1
foo.bar()()     // this: 0, that: 1
上記の例ではba'rに匿名関数を返しましたが、この匿名関数は外部で呼び出されます.即ち、foo.bar()はbarの実行コンテキストの変数オブジェクトthatに読み込まれて、この関数は一つのクローズドを形成します.
はい、上記のコースを理解しました.以下に閉包を説明してください.
クローズドとは、他の関数の内部変数を読み取る機能です.
Javascript言語では、関数内部のサブ関数だけが局所変数を読み取ることができるので、クローズドを単に「関数の内部に定義された関数」と理解することができます.
var x = 0;
var bar:function () {
        var n = 999;
        return function () {
           return n;
        }
    }
var outer = bar();
outer() // 999
用途:
  • 関数内部の変数
  • を読みだします.
  • は、これらの変数の値を常にメモリに保持させる.
    上のコードを修正します.
    var add;
    var bar = function () {
            var n = 999;
            add = function () {
                n += 1;
            }
            return function () {
               return n;
            }
        }
    var outer = bar();
    outer() // 999 
    add();
    outer(); // 1000
    
    nはずっとメモリに保存されていますが、bar()の実行が完了してから廃棄されません.原因:barの中の匿名関数はouterに割り当てられました.これはouterが破壊されていない時に、この匿名関数はずっとメモリに存在しています.匿名関数の存在はbarに依存しています.だからbarはメモリに全部使わなければなりません.だからbarは呼び出しが終わった後にゴミ回収機構を作ることはできません.
    上のaddが受け入れるのも匿名関数であり、その匿名関数自体もクローズドされているので、外部で変数を操作しても良い.
    注意点
  • はメモリ漏れの原因となります.
  • クローズドは、内部変数の値を変更するので、クローズドが対象となるパブリックメソッドを使用する際には、慎重にする必要があります.クローズドされたアプリケーションの一例
  • 単一の例のパターンの定義は、クラスを生成する唯一の例である.
    一例モードはjsの中でよく会います.例えば、var a={}実は一例です.
    しかし、より意味のある一例を書きます.
    var singleton = function( fn ){
        var result;
        return function(){
            return result || ( result = fn .apply( this, arguments ) );
        }
    }
    
    もっと簡潔に:
    var singleton = (function () {
        var instance;
        return function (object) {
            if(!instance){
                instance = new object();
            }
            return instance;
        }
        })();