有一些關於JS中的對象,執行上下文,我不明白。JavaScript中的執行上下文和對象
當我們創建一個對象時,它是否會創建一個執行上下文?因爲執行上下文是在函數被調用時創建的。如果沒有,那麼對象就像實際執行上下文中的其他變量一樣?
謝謝。
有一些關於JS中的對象,執行上下文,我不明白。JavaScript中的執行上下文和對象
當我們創建一個對象時,它是否會創建一個執行上下文?因爲執行上下文是在函數被調用時創建的。如果沒有,那麼對象就像實際執行上下文中的其他變量一樣?
謝謝。
當我們創建一個對象時,它是否會創建一個執行上下文?
因爲執行上下文號
時調用的函數時被創建。
確實如此,但創建對象與調用函數不同。
如果沒有,那麼該對象就像實際執行上下文中的其他變量一樣?
對象存在於內存中,並且參考給它的任何變量,也將其存儲在屬性存在,如果你把它存儲在一個變量,該變量是在相關的詞法環境對象舉行聲明變量的執行上下文。
一個具體的例子可能會有幫助:
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
返回後仍然保留對該閉包的引用,詞法環境將被該閉包保留;如果我們在foo
之前創建了閉包,並且在foo
之後保留了引用,更多關於this question and its answers的關閉。 (+1)
(+1) – Christos