2016-07-03 1 views
0

この例を見ると、私たちがouterFunction = null;を設定したときに何が起こっているのかを理解するのが難しいです。私の最初の考えは、function outerFunction(){ //nothing }です。しかし、referenceToInnerFunctionを呼び出すと、我々はまだ猿の値を得ることができます。私はこれがスコープと関係があると確信していますが、私はそれの周りに私の頭を包むことはできません。私はreferenceToInnerFunctionを呼び出すときに、私もnullを得るようにするJavaScriptの近代的な実装のmonkey?閉鎖の例を分析する

function outerFunction() { 
    var outerVar = "monkey"; 

    function innerFunction() { 
     return outerVar; 
    } 

    return innerFunction; 
} 

var referenceToInnerFunction = outerFunction(); 
alert(referenceToInnerFunction()); 

outerFunction = null; 
alert(referenceToInnerFunction()); 
+0

クロージャは、内部関数コードがその外側スコープ変数にアクセスするときに作成されるスコープです.'innerFunction'は常にそのクロージャでouterVarへのアクセスを持ちます。 outerFunctionをnullに設定した場合でも –

+0

内部関数への参照を 'var referenceToInnerFunction = outerFunction();'で作成するので、アクセス可能になります。それはすべての参照についてです。 – scriptmonster

+0

だから私はoutFunctionの中に別の10個の関数を入れ子にします。それらのすべてがnullに設定されていて、innerFunctionがまだ定義されていても、それは10個の関数と外側スコープのすべてにアクセスできますか? –

答えて

2

ガベージコレクタアルゴリズムにoposedとしても、どのように私はそれがあるときに何かがゴミを収集することができることを考慮し、この問題を解決することができます到達できません。ここreferenceToInnerFunction

var referenceToInnerFunction = outerFunction(); 

のでouterVarはおそらく限り、あなたはそれへのアクセス権を持つ何かを保つよう解放することはできませんので、outerVarへのアクセスを維持します。ここ

より:あなたはすでに、それはあなたがそれを作成した値を変更しても変わりませんReferenceToInnerFunction変数のメモリ空間を割り当てたhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

1

。変数をリセットするには 、あなたはそれ故に、それはゴミを収集することができない、あなたはnullにouterFunctionを設定した場合、内部の機能はまだ外側の関数によって閉じ/制限され、再び

ReferenceToInnerFunction = null 
0

それを設定する必要があります。 なぜそれが外側にアクセスできるのですか