1

これは、クロージャ内にローカル オブジェクトを作成するコードです。

function A() {
    this.welcome = "Welcome";
}

var P = (function() {
    var a = new A();
    function printa() {
        console.log(a);
    }
    return {
        printa: printa
    };
})();


P.printa();

それは印刷します:

{ welcome: 'Welcome' }

P=... 関数が実行された後、P は関数 printa() への参照を保持する新しいオブジェクトを取得しますが、この時点でローカル変数 a を解放する必要があります。なぜ解放されないのですか?それとも、ガベージコレクションされていないために一時的にそこにあるのでしょうか?

4

3 に答える 3

4

a関数からのクロージャによって参照され続けprintaます。

a関数への参照がなくなった後、しばらくするとガベージコレクションが行われprintaます。

于 2012-08-01T17:34:06.140 に答える
2

a関数によって作成されたクロージャーの外側に常に存在しますprintaaはまだのスコープチェーン内にあるprintaため、への参照がなくなるまで解放されません(つまり、ガベージコレクションされます)。printa

ただし、ガベージコレクションはブラウザごとに異なるため(IE6は誰ですか?)、ガベージコレクションが正確に行われる時期にすべてが賭けられます。

于 2012-08-01T17:34:28.130 に答える
2

ルールがあります。ある変数が何らかのスコープによって保持されている場合、それは自由ではありません。あなたの例では、変数aprinta関数のスコープで使用されています。

于 2012-08-01T17:33:50.493 に答える