2017-04-08 5 views
1

JSのオブジェクト、実行コンテキストについて、私が理解できないことがあります。JavaScriptの実行コンテキストとオブジェクト

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

ありがとうございます。

答えて

4

オブジェクトを作成すると、実行コンテキストが作成されますか?関数が呼び出されたときに実行コンテキストが作成されるので

これは当てはまりますが、オブジェクトを作成することは関数を呼び出すこととは異なります。

もしそうでなければ、オブジェクトは実際の実行コンテキストで他の変数と同じようになりますか?

オブジェクトがメモリ内に存在し、それに参照は、あなたがそれを記憶された任意の変数またはプロパティに存在する。あなたは変数に格納した場合、その変数は、字句環境オブジェクト関連に保持されます変数が宣言された実行コンテキスト。

具体的な例が役立つかもしれない:

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

fooを呼び出すと、実行コンテキストとそれに関連する語彙の環境オブジェクトを作成します。 nおよびoの変数は、その語彙環境に格納されているバインディングです。 nバインディングの値はプリミティブ番号42です。oバインディングの値は、オブジェクトに対する参照です。オブジェクト自体はメモリ内の他の場所に存在します。

 
+−−−−−−−−−−−−−−−−−−−−+ 
| Execution Context | 
+−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−+ 
| Current Lex Env |−−>| Lexical Environment | 
| (some other stuff) | +−−−−−−−−−−−−−−−−−−−−−+ 
+−−−−−−−−−−−−−−−−−−−−+ | n: 42    | +−−−−−−−−+ 
         | o     |−−>| Object | 
         | (some other stuff) | +−−−−−−−−+ 
         +−−−−−−−−−−−−−−−−−−−−−+ 

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

fooが返されると、foo内にクロージャが作成されなかった場合、実行コンテキストとその関連語彙環境はガベージコレクションの対象となります。

あなたの疑問を少し遠慮してください:fooの中にクロージャーを作成し、fooが返された後でも参照を保持していれば、そのクロージャーによってレキシカル環境が保持されます。閉鎖の詳細はthis question and its answersです。

+1

詳細な説明(+1) – Christos

関連する問題