天天看點

JavaScript深入之執行上下文

兩段代碼都會列印'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)

繼續閱讀