2016-04-11 6 views
2

私はキャメロンのを読んでいます。HTM5 JavaScript & JQuery JavaScriptと閉鎖の彼のセクションでは、彼はこの例を示します:それは、その時点で存在していて、そのコピーを保持として、その環境上で「閉」F2無名関数は関数内で定義されたJavaScriptのクロージャと変数の参照

function f2() 
{ 
    var i = 0; 
    return function() { 
     return ++i; 
    }; 
} 

環境。変数iは、関数が宣言されたときにアクセス可能であったため、関数が呼び出されたときでも使用できます。 JavaScriptは、無名関数が変数iを参照しており、この関数は破棄されていないため、に依存するi変数を破棄していないことを認識しました。

「JavaScriptが実現しました...」と書かれている太字のセクションでは、JSが囲まれた変数(つまりクロージャの外側)とクロージャの間の依存関係を識別したときに、変数に依存していなければ、それは破壊されます(ガベージコレクションされます)? var iは破壊されますが、上記のclosureの例ではvar iは破壊されませんか?

function f2() 
{ 
    var i = 0; 
} 

キャメロン、デーン(2013-10-30)。ソフトウェアエンジニアがHTML5、JavaScript、jQueryを学ぶ:標準ベースのWebアプリケーションのガイド(p。74)。 Cisdal Publishing。キンドル版。

+0

基本的にはいです。 –

+0

はい。もはや参照されなくなると、GCによって破壊されます。 – micmia

答えて

0

あなたの質問に対する短い答えは、「はい、それは正しい」ということです。もっと長い例が役に立ちますか?あなたが与えた例のよう

function main() { 
    var i = 0; 
    var int = setInterval(
     function() { 
      console.log(++i); 
      if (i > 9) { 
       clearInterval(int); 
      } 
     }, 100); 
} 

、可変iは、内側関数から参照され、したがって限り、その内部機能が使用されているようにするために周りに保持されます。

この例では、同じ理由でintも有効にしていますが、ここではできる限りGCをクリーンアップする方法も示します。 i > 9インターバルタイマがクリアされると、内部関数への参照がなくなったことを意味します。これは、その内部関数によって参照される変数iintがもはや参照されないことを意味します。つまり、GCがすべてを破棄することができます。

関連する問題