搜尋

首頁  >  問答  >  主體

javascript forEach 是否為每個陣列項目建立一個新的執行上下文,或者只是更新目前執行上下文的詞法環境?

在下面的程式碼中,是為數組中的每個項目建立一個新的執行上下文,還是執行上下文保持不變,只是詞法環境的環境記錄更新?

程式碼不會引發錯誤,因此我假設新的作用域(詞法環境)是獨立於執行上下文而創建的,但我不確定我的說法是否正確。

const nums = [1, 2, 3]

nums.forEach(num => {
  const foo = num
})

P粉663883862P粉663883862267 天前459

全部回覆(1)我來回復

  • P粉674876385

    P粉6748763852024-04-02 23:22:53

    提供給標準函式庫函數的回呼沒有什麼特別的。它們仍然是函數,並且仍然以調用函數的通常方式進行調用。

    是的。每當您呼叫函數時(在本例中,當 forEach 呼叫其回呼時),都會建立一個新的執行上下文。

    (在本例中)不是與建立新的執行上下文分開的,不是。作為呼叫函數的標準過程的一部分。

    相較之下,考慮一個 for-of 迴圈:

    for (const num of nums) {
        const foo = num
    }

    這裡沒有回呼函數可以呼叫;循環體只是一個區塊。但是,由於區塊作用域語義的定義方式,會為每次循環迭代建立一個新的詞法環境物件。這意味著,與 forEach 回調類似,每次循環迭代都有一個新的 foo,即使不需要函數呼叫。 (如果您要在該區塊內建立事件處理程序或類似的事件處理程序,這非常方便。)(如果我們使用var 代替,則不會每次都有一個新的,var 會跳出該區塊到周圍函數作用域或全域作用域,因為var 不是區塊作用域。這是我建議永遠不要在新程式碼中使用var的原因之一。)

    回覆
    0
  • 取消回覆