在下面的程式碼中,是為數組中的每個項目建立一個新的執行上下文,還是執行上下文保持不變,只是詞法環境的環境記錄更新?
程式碼不會引發錯誤,因此我假設新的作用域(詞法環境)是獨立於執行上下文而創建的,但我不確定我的說法是否正確。
const nums = [1, 2, 3] nums.forEach(num => { const foo = num })
提供給標準函式庫函數的回呼沒有什麼特別的。它們仍然是函數,並且仍然以調用函數的通常方式進行調用。
是的。每當您呼叫函數時(在本例中,當 forEach 呼叫其回呼時),都會建立一個新的執行上下文。
forEach
(在本例中)不是與建立新的執行上下文分開的,不是。作為呼叫函數的標準過程的一部分。
相較之下,考慮一個 for-of 迴圈:
for-of
for (const num of nums) { const foo = num }
這裡沒有回呼函數可以呼叫;循環體只是一個區塊。但是,由於區塊作用域語義的定義方式,會為每次循環迭代建立一個新的詞法環境物件。這意味著,與 forEach 回調類似,每次循環迭代都有一個新的 foo,即使不需要函數呼叫。 (如果您要在該區塊內建立事件處理程序或類似的事件處理程序,這非常方便。)(如果我們使用var 代替,則不會每次都有一個新的,var 會跳出該區塊到周圍函數作用域或全域作用域,因為var 不是區塊作用域。這是我建議永遠不要在新程式碼中使用var的原因之一。)
foo
var
提供給標準函式庫函數的回呼沒有什麼特別的。它們仍然是函數,並且仍然以調用函數的通常方式進行調用。
是的。每當您呼叫函數時(在本例中,當
forEach
呼叫其回呼時),都會建立一個新的執行上下文。(在本例中)不是與建立新的執行上下文分開的,不是。作為呼叫函數的標準過程的一部分。
相較之下,考慮一個
for-of
迴圈:這裡沒有回呼函數可以呼叫;循環體只是一個區塊。但是,由於區塊作用域語義的定義方式,會為每次循環迭代建立一個新的詞法環境物件。這意味著,與
forEach
回調類似,每次循環迭代都有一個新的foo
,即使不需要函數呼叫。 (如果您要在該區塊內建立事件處理程序或類似的事件處理程序,這非常方便。)(如果我們使用var
代替,則不會每次都有一個新的,var
會跳出該區塊到周圍函數作用域或全域作用域,因為var
不是區塊作用域。這是我建議永遠不要在新程式碼中使用var
的原因之一。)