3

私が理解していないJSのオブジェクト、実行コンテキストについて何かがあります。

オブジェクトを作成すると、実行コンテキストが作成されますか? 関数が呼び出されると実行コンテキストが作成されるためです。そうでない場合、オブジェクトは実際の実行コンテキストの other 変数と同じですか?

ありがとうございました。

4

1 に答える 1

5

オブジェクトを作成すると、実行コンテキストが作成されますか?

いいえ。

関数が呼び出されると実行コンテキストが作成されるためです。

その通りですが、オブジェクトの作成は関数の呼び出しとは異なります。

そうでない場合、オブジェクトは実際の実行コンテキストの other 変数と同じですか?

オブジェクトはメモリに存在し、それへの参照は格納した変数またはプロパティに存在します。変数に格納すると、その変数は、変数が宣言された実行コンテキストに関連付けられたレキシカル環境オブジェクトに保持されます。

具体的な例が役立つ場合があります。

function foo() {
    var n = 42;
    var o = {};
    console.log(n, o.toString()); // 42, [object Object]
}
foo();

呼び出しfooにより、実行コンテキストとそれに関連付けられたレキシカル環境オブジェクトが作成されます。nおよびo変数は、そのレキシカル環境に格納されたバインディングです。nバインディングの値は、プリミティブ番号 42 です。バインディングoの値は、オブジェクトへの参照です。オブジェクト自体はメモリ内の別の場所に存在します。

+-------------------+
| | 実行コンテキスト |
+------------------+ +-------------------+ +-------------------+
| | 現在の Lex 環境 |-->| レキシカル環境 |
| | (その他のもの) | +--------------------+
+-------------------+ | n:42 | +--------+
                         | | o |-->| オブジェクト |
                         | | (その他のもの) | +--------+
                         +--------------------+

繰り返しになりますが、そのコンテキストとそのレキシカル環境はfoo、オブジェクトを作成することによってではなく、への呼び出しによって作成されます。

戻り後foo、 内でクロージャが作成されていない場合foo、実行コンテキストとそれに関連付けられたレキシカル環境はガベージ コレクションの対象になります。

あなたの質問から少し離れて: クロージャを作成し、返さfooれた後でもそれへの参照を保持していた場合foo、レキシカル環境はそのクロージャによって保持されます。この質問とその回答のクロージャーの詳細。

于 2017-04-08T11:18:30.380 に答える