0

私はこれらの 2 つのブログを読んでいます: David Shariff によって発行された実行コンテキストとスコープ チェーンでは、JavaScript の実行コンテキストとスコープ チェーンの概念について詳しく説明してます

上記のブログを読んだ後ではっきりしないことの 1 つは、javascript が親関数の実行コンテキストがガベージ コレクションされるのをどのように防止するかということです。

次の非常に単純なコードを見てみましょう。

function outer(){
    var v1 = 'variable in outer function';

    function inner(){
        alert(v1);
    }

    return inner;
}

var innerFunc = outer();

外部関数が呼び出されると、内部関数へのポインターを取得します。したがって、この段階では、内部関数が作成/定義されていますが、まだ呼び出されていません。

ブログによると、関数が呼び出されている場合にのみ、スコープ チェーンが確立されます。したがって、内部関数が呼び出される前に、外部関数の実行コンテキストを参照するポインターはないと思います。では、js エンジンは外部関数の実行コンテキストがガベージ コレクションされるのをどのように防ぐのでしょうか?

4

1 に答える 1

1

内部関数には、1で作成されたコンテキストへの参照があります。関数が呼び出されるまでスコープ チェーンは存在しませんが、スコープ チェーンは外部コンテキストを維持するものではありません。

1または厳密に言えば、内部関数からそれが使用するすべてのクロージャ変数への参照のチェーンがあります。必ずしもコンテキスト全体を維持する必要はありません。

于 2015-05-26T06:35:57.150 に答える