1.1執(zhí)行環(huán)境
執(zhí)行環(huán)境可以簡(jiǎn)稱(chēng)為環(huán)境计维,可以理解為JS被解析和執(zhí)行所在的外部環(huán)境袜香。
1.1.1全局執(zhí)行環(huán)境
全局執(zhí)行環(huán)境是最外層的一個(gè)環(huán)境,根據(jù)宿主環(huán)境的不同鲫惶,全局對(duì)象也會(huì)有所區(qū)別蜈首,比如在瀏覽器中全局環(huán)境是window,在node中全局環(huán)境就是這個(gè)文件的module對(duì)象。
1.1.2函數(shù)執(zhí)行環(huán)境
每次調(diào)用一個(gè)函數(shù)時(shí)欢策,都會(huì)創(chuàng)建一個(gè)新的執(zhí)行環(huán)境吆寨,在這個(gè)函數(shù)內(nèi)的任何聲明都無(wú)法在該函數(shù)之外的地方訪問(wèn)
1.1.3Eval函數(shù)執(zhí)行環(huán)境
在eval()函數(shù)中的代碼,不建議使用
1.1.4 執(zhí)行棧
我們先了解一下執(zhí)行棧內(nèi)的執(zhí)行順序:后進(jìn)先出踩寇,意思就是最早來(lái)的最晚走啄清,最后來(lái)的最先走(參考下圖理解)
因?yàn)镴avaScript在瀏覽器環(huán)境中的執(zhí)行是單線程(就是一次只能做一件事,不能邊吃飯邊看電視俺孙,只能先吃飯?jiān)倏措娨暎├弊洌瑢?duì)于多個(gè)任務(wù),只能采用任務(wù)隊(duì)列的方式(就是先吃飯睛榄,一定要等吃完飯才能看電視)荣茫。
舉一個(gè)例子(暫時(shí)不用去看current execution context這一層,其實(shí)就是Execution Context N+1)场靴,
- 調(diào)用 一個(gè)函數(shù)f1啡莉,執(zhí)行流先進(jìn)入全局環(huán)境
(Global Execution Context這一層) - f1的環(huán)境被推入環(huán)境棧中
(Execution Context N+1這一層按照綠色箭頭進(jìn)入) - 這時(shí)候函數(shù)f1又調(diào)用了函數(shù)f2,f2的環(huán)境被推入環(huán)境棧中
(Execution Context N+2這一層按照綠色箭頭進(jìn)入) - f2執(zhí)行完之后就立馬離開(kāi)執(zhí)行棧
Execution Context N+2這一層按照紅箭頭離開(kāi) - f1執(zhí)行完之后在f2離開(kāi)環(huán)境棧后再離開(kāi)環(huán)境棧
Execution Context N+1這一層按照紅箭頭離開(kāi) - 全局環(huán)境不會(huì)消失旨剥,除非關(guān)閉瀏覽器或者關(guān)閉網(wǎng)頁(yè)所以Global Execution Context這一層不會(huì)消失
看到這里咧欣,我們就能理解另外一個(gè)概念:執(zhí)行環(huán)境的兩個(gè)階段
1. 創(chuàng)建階段
- 當(dāng)函數(shù)被調(diào)用,但是為執(zhí)行內(nèi)部代碼之前:
- 創(chuàng)建一個(gè)作用域鏈
- 創(chuàng)建變量轨帜,函數(shù)和參數(shù)魄咕。
- 確定this的值。
2, 執(zhí)行階段
- 賦值阵谚,引用函數(shù),解釋/執(zhí)行代碼烟具。