首先關于整個生命周期盆色,最重要的是要了解它的編譯過程。
- 發(fā)現(xiàn)有代碼調用了一個函數(shù)
- 在執(zhí)行這個function之前祟剔,創(chuàng)建一個執(zhí)行上下文(execution context)隔躲,也可以叫執(zhí)行環(huán)境。
- 進入創(chuàng)建階段(VO創(chuàng)建)
a. 初始化作用域鏈(scope chain)
b. 創(chuàng)建變量函數(shù)(variable object / VO)
c. 創(chuàng)建參數(shù)對象(arguments object物延,傳進來的參數(shù)),檢查上下文宣旱,初始化其名字和值,以及建立引用對象的拷貝叛薯。
d. 掃描上下文中的函數(shù)聲明
e. 為每一個掃描到的函數(shù)聲明在VO中創(chuàng)建一個屬性浑吟,命名為函數(shù)的名字,指向了存儲空間中的對應函數(shù)耗溜。
f. 如果函數(shù)名稱已經存在了组力,這個引用指針將被重寫為新的這一個。
g. 掃描上下文中的變量聲明
h. 為每一個掃描到的變量聲明在VO中創(chuàng)建一個屬性抖拴,命名為變量的名字燎字,初始化值為undefined。
i. 如果變量名在內存中已經存在了阿宅,就跳過候衍。
j. 決定上下文中this的指向。 - 執(zhí)行階段(VO => AO)
a. 執(zhí)行/解釋上下文中的function洒放,為變量賦值
b. 代碼按行執(zhí)行
就我個人理解蛉鹿,他們的相應概念和包含內容如下。
scope :變量/函數(shù)起作用的區(qū)域
scope chain : 保證對執(zhí)行環(huán)境有權訪問的所有變量和函數(shù)的有序訪問往湿。相當于VO + [scope]
我們可以將作用域定義為一套規(guī)則妖异,用來管理引擎如何在當前作用域以及嵌套的子作用域中根據(jù)標識符名稱進行變量查找,作用域鏈是這套規(guī)則的具體實現(xiàn)煌茴。
execution context = {VO, this, [scope]}
this : 函數(shù)/方法的擁有者