0

Web 開発者向けの Professional JavaScript を読んでいます

「ガベージコレクターが実行されると、メモリに保存されているすべての変数がマークされます。次に、コンテキスト内の変数とコンテキスト内の変数によって参照される変数のマークがクリアされます。」を読むときに問題が発生しました。

変数がオブジェクトに到達できなかった場合、関連するメモリが再利用されることを知っています。

「コンテキスト内の変数」とはどういう意味ですか? それらはスコープチェーンで見つけることができる変数ですか? しかし、「コンテキスト内変数によって参照される変数」についてはどうでしょうか。

私は混乱しています。

4

2 に答える 2

2

クロージャーで使用される変数を誤って削除しないようにするためだと思います。JavaScript では、他の関数型言語と同様に、オブジェクトに到達できないというだけでは、オブジェクトを削除する必要があることを伝えるには十分ではありません。

たとえば、次のコードを見てください。

function a () {
    var x=0;
    return function () {
        alert(x++);
    }
}

var b = a();
// at this point, the instance of `x` created by calling `a` is
// no longer reachable but we are still using it in the closure.

「到達不能」ルールだけに従うと、作成されたクロージャーは変数を失いますx

于 2012-11-03T13:00:05.717 に答える
0

このことを考慮:

(function(){
    var sobriety = [];
    window.inception = function() {
        var i = 0, 
            j = 0,
            inner_level = { i: i }, 
            level       = { level: inner_level },
            food        = {};
        return function() { 
            var new_level = {
                level: level.level
            };
            new_level[i] = 'step ' + i;
            new_level.level.i = i;
            sobriety[i++] = new_level; 
        };
    };
    window.show_my_sobriety = function() { console.log(sobriety); };
})();

var agent = inception();
agent(); agent(); agent();
show_my_sobriety();​

JSフィドル

iこの例はやや洗練されていることは認めますが、(プリミティブ)とinner_level(参照型)の違いを示すために作成する必要がありました。

ここに、ローカルに1つの変数があり、(オブジェクトsobrietyのプロパティに割り当てることによって)2つの関数がグローバルになっているモジュールがあります。windowこれらのグローバル関数はsobriety、それを定義したモジュールが終了した後でも変数にアクセスできることに注意してください(in-context)。

inception関数は、呼び出されると、5つの変数を定義します。2つのスカラー(ij)と3つの参照(inner_levellevelfood)です。次に、関数を定義してそれを返します。

この関数は明らかにiand level(同じコンテキスト)とsobriety(外部レベルのコンテキスト)にアクセスしますが、 jandにはアクセスしませんfoodwindow.inceptionしたがって、後者は完了直後にGCによって収集されます。ただし、前者は収集されないままです。内部関数によって参照されるためです。

今トリッキーな部分。inner_levelこの関数にはアクセスは表示されませんlevelが、同じ名前のオブジェクトのプロパティの値であるため、引き続きアクセスされます。そして、結果を確認すると、3つの要素すべてが同じlevel.i値(2に等しい)を持っていることがわかります。これは、「コンテキスト内の変数によって参照される変数」によって理解されるものです。

于 2012-11-03T13:24:59.630 に答える