這篇文章帶給大家的內容是關於JavaScript執行上下文的詳細介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
在《深入學習js之-執行上下文堆疊》中說過,當JavaScript程式碼執行一段可執行程式碼(executable code)時,會建立對應的執行上下文(execution context)
對於每一個執行上下文,都有三個重要的屬性:
變數物件(Variable object VO)
作用域鏈(Scope chain)
this
本文我們結合這三個部分的內容,講講執行脈絡的具體處理過程。
在《深入學習js之-詞法作用域與動態作用域》中,提出這樣一道思考題:
// 思考题一: var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope(); // 思考题二: var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope()();
兩段程式碼都會列印local scope
,但是還是有些許差異的,本文就詳細的解析執行上下文堆疊和執行上下文的具體變化過程。
我們分析第一段程式碼:
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope();
執行過程如下:
1、執行全域程式碼,建立全域執行上下文,全域上下文被壓入執行上下文堆疊
ECStack = [ globalContext ];
2、全域上下文初始化
globalContext = { VO: [global], Scope: [globalContext.VO], this: globalContext.VO }
2、初始化的同時,checkscope 函數被創建,保存作用域鍊到函數內部的屬性[[scope]]
checkscope.[[scope]] = [ globalContext.VO ];
3、執行checkScope 函數,建立checkScope 函數執行上下文,checkScope 函數執行上下文被壓入執行上下文堆疊:
ECStack = [ checkscopeContext, globalContext ];
4、checkscope 函數執行上下文初始化:
1.複製函數[[scope]] 屬性建立作用域鏈,
2.用arguments 建立活動對象,
3.初始化活動對象,即加入形參、函數宣告、變數聲明,
4.將活動物件壓入checkscope 作用域鏈頂端,
同時f 函數被創建,保存作用域鏈到f 函數的內部屬性[[scope]]
checkscopeContext = { AO: { arguments: { length: 0 }, scope: undefined, f: reference to function f(){} }, Scope: [AO, globalContext.VO], this: undefined }
5、執行f函數,建立f 函數執行上下文,f 函數執行上下文被壓入執行上下文堆疊
ECStack = [ fContext, checkscopeContext, globalContext ]
6、f 函數執行上下文初始化, 以下跟第4 步相同:
1.複製函數[[scope]]
屬性建立作用域鏈
2.用arguments 建立活動物件
3 .初始化活動對象,即加入形參、函數宣告、變數宣告
4.將活動物件壓入f 作用域鏈頂端
fContext = { AO: { arguments: { length: 0 } }, Scope: [AO, checkscopeContext.AO, globalContext.VO], this: undefined }
7、f 函數執行,沿著作用域鏈尋找scope值,返回scope 值
8、f 函數執行完畢,f 函數上下文從執行上下文堆疊中彈出
ECStack = [ checkscopeContext, globalContext ]
9、checkscope 函數執行完畢,checkscope 執行上下文從執行上下文堆疊中彈出
ECStack = [ globalContext ]
以上是JavaScript執行上下文的詳細介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!