Javascriptの関数的対象(二)ゴミ回収器の角度からクローズドを理解する

1519 ワード


Javascript関数が戻ると、js解像度はそのスコープ内のすべての変数と関数を保持します.
 
クローズド(Closeure)という語は、機能的ドメインの現場が「クローズドされた」ことをイメージして説明しています.
 
この関数が他のオブジェクトに参照されなくなるまで、そのスコープ内の変数と関数はリリースされて回収されます. 
 
以下はjsのクローズドに関するコードです.
 
 
function outerFunc(){

    var privateAttr = 10;

    function innerFunc(){
        privateAttr *= 2;
        return privateAttr; 
    }
 
    return innerFunc;
}

//     outerFunc  ,      innerFunc     ,
//          refInnerFunc
var refInnerFunc = outerFunc();

//    refInnerFunc         innerFunc   
refInnerFunc(); // return 20   privateAttr  innerFunc     
refInnerFunc(); // return 40

//   outerFunc  ,       innerFunc     
var refInnerFunc2 = outerFunc();
refInnerFunc2(); // return 20        privateAttr      。
 
 
 
java回収メカニズムの解釈によると、方法内の局所変数は、この方法が実行された後、
 
他のオブジェクトに引用されない場合は、ゴミ回収器は自分で適切なタイミングでこれらの局所変数を回収することができます.
 
しかし、jsのゴミ回収メカニズムはjavaと違って、上記のjsコードの実行結果はこの点を証明できます.
 
jsのゴミ回収メカニズムは同様に、他のオブジェクトに引用されない変数や方法を回収します.
 
しかし、jsの参照は変数だけではなく、関数を指すこともできますので、上記のjsコードでは、
 
関数innerFunへの参照がrefInnerFunではまだnullに設定されていない限り、
 
関数innerFunの機能領域にある局部変数は、jsごみ箱に回収されません.
 
局所変数prvateAttrは、安全で比較的閉鎖的な「クローズド」環境にあると考えられています.
 
そのアクセスの唯一の方法は、同じスコープにあるinnerFun関数を呼び出すことによって行われる.
 
 
まで inner Fun 関数は他のオブジェクトには参照されなくなり、そのスコープ内の変数と関数が解放されて回収されます.