1.要理解作用域就得理解JS引擎解析機制
如何解析一段可執行代碼?
分了兩個階段:解析代碼和執行代碼。其中解析代碼可以理解爲記名字,就是先把關鍵字var和function定義的變量名登記了下來,這也就有了變量提升這一說。在執行代碼階段纔是真正的執行賦值,運算等操作。
2.創建全局對象,創建執行環境棧,創建全局執行環境,入棧
暫不解析這幾個名詞,先來看一個例子。
var scope = 'global';
function fn(){
alert(scope);
var scope ='local';
alert(scope);
}
fn();
alert(scope);
(1)先創建全局對象GO(global object),全局執行環境ECG(execute context global)入棧。
GO中會存放全局變量,ECG是一個代碼執行環境,每個塊代碼被執行時中都進入一個環境,在這個環境裏就是維護了這段代碼的變量。而ECG則是全局的。
(2)解析代碼(找變量名)
(3)執行代碼(賦值,運行函數)
(4)fn()解析,就有該函數的執行環境,入棧。函數的活動對象。