2017-04-08 79 views
1

有一些關於JS中的對象,執行上下文,我不明白。JavaScript中的執行上下文和對象

當我們創建一個對象時,它是否會創建一個執行上下文?因爲執行上下文是在函數被調用時創建的。如果沒有,那麼對象就像實際執行上下文中的其他變量一樣?

謝謝。

回答

4

當我們創建一個對象時,它是否會創建一個執行上下文?

因爲執行上下文號

時調用的函數時被創建。

確實如此,但創建對象與調用函數不同。

如果沒有,那麼該對象就像實際執行上下文中的其他變量一樣?

對象存在於內存中,並且參考給它的任何變量,也將其存儲在屬性存在,如果你把它存儲在一個變量,該變量是在相關的詞法環境對象舉行聲明變量的執行上下文。

一個具體的例子可能會有幫助:

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

調用foo創建一個執行上下文和與其關聯的詞法環境對象。存儲在該詞彙環境中的no變量是綁定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返回後仍然保留對該閉包的引用,詞法環境將被該閉包保留;如果我們在foo之前創建了閉包,並且在foo之後保留了引用,更多關於this question and its answers的關閉。 (+1)

+1

(+1) – Christos

相關問題