兩段代碼都會列印'local scope'。雖然兩段代碼執行的結果一樣,但是兩段代碼究竟有哪些不同呢?
我們分析第一段代碼:
執行過程如下:
1.執行全局代碼,建立全局執行上下文,全局上下文被壓入執行上下文棧
2.全局上下文初始化
2.初始化的同時,checkscope 函數被建立,儲存作用域鍊到函數的内部屬性[[scope]]
3.執行 checkscope 函數,建立 checkscope 函數執行上下文,checkscope 函數執行上下文被壓入執行上下文棧
4.checkscope 函數執行上下文初始化:
複制函數 [[scope]] 屬性建立作用域鍊,
用 arguments 建立活動對象,
初始化活動對象,即加入形參、函數聲明、變量聲明,
将活動對象壓入 checkscope 作用域鍊頂端。
同時 f 函數被建立,儲存作用域鍊到 f 函數的内部屬性[[scope]]
5.執行 f 函數,建立 f 函數執行上下文,f 函數執行上下文被壓入執行上下文棧
6.f 函數執行上下文初始化, 以下跟第 4 步相同:
複制函數 [[scope]] 屬性建立作用域鍊
用 arguments 建立活動對象
初始化活動對象,即加入形參、函數聲明、變量聲明
将活動對象壓入 f 作用域鍊頂端
7.f 函數執行,沿着作用域鍊查找 scope 值,傳回 scope 值
8.f 函數執行完畢,f 函數上下文從執行上下文棧中彈出
9.checkscope 函數執行完畢,checkscope 執行上下文從執行上下文棧中彈出
第二段代碼就留給大家去嘗試模拟它的執行過程。
不過,在下一篇《JavaScript深入之閉包》中也會提及這段代碼的執行過程。
本人轉載自冴羽(https://github.com/mqyqingfeng)