#####1.1執行環境 執行環境可以簡稱為環境,可以理解為JS被解析和執行所在的外部環境。 #####1.1.1全域性執行環境 全域性執行環境是最外層的一個環境,根據宿主環境的不同,全域性物件也會有所區別,比如在瀏覽器中全域性環境是window,在node中全域性環境就是這個檔案的module物件。 #####1.1.2函式執行環境 每次呼叫一個函式時,都會建立一個新的執行環境,在這個函式內的任何宣告都無法在該函式之外的地方訪問 #####1.1.3Eval函式執行環境 在eval()函式中的程式碼,不建議使用
#####1.1.4 執行棧 我們先了解一下執行棧內的執行順序:後進先出,意思就是最早來的最晚走,最後來的最先走(參考下圖理解)
因為JavaScript在瀏覽器環境中的執行是單執行緒(就是一次只能做一件事,不能邊吃飯邊看電視,只能先吃飯再看電視),對於多個任務,只能採用任務佇列的方式(就是先吃飯,一定要等吃完飯才能看電視)。
舉一個例子(暫時不用去看current execution context這一層,其實就是Execution Context N+1),
- 呼叫 一個函式f1,執行流先進入全域性環境 (Global Execution Context這一層)
- f1的環境被推入環境棧中 (Execution Context N+1這一層按照綠色箭頭進入)
- 這時候函式f1又呼叫了函式f2,f2的環境被推入環境棧中 (Execution Context N+2這一層按照綠色箭頭進入)
- f2執行完之後就立馬離開執行棧 Execution Context N+2這一層按照紅箭頭離開
- f1執行完之後在f2離開環境棧後再離開環境棧 Execution Context N+1這一層按照紅箭頭離開
- 全域性環境不會消失,除非關閉瀏覽器或者關閉網頁所以Global Execution Context這一層不會消失
看到這裡,我們就能理解另外一個概念:執行環境的兩個階段 ######1. 建立階段
- 當函式被呼叫,但是為執行內部程式碼之前:
- 建立一個作用域鏈
- 建立變數,函式和引數。
- 確定this的值。 ######2, 執行階段
- 賦值,引用函式,解釋/執行程式碼。