在《深入--詞法作用域與動態作用域》中,提出這樣一道思考題
var scope = "global scope";
function checkscope()
return f();
}checkscope();
var scope = "global scope";
function checkscope()
return f;
}checkscope()();
兩段**都會列印『local scope』,雖然兩段**執行的結果一樣,但是兩段**究竟有哪些不同呢?
緊接著就在《深入--執行上下文棧》中,講到了兩者的區別在於執行上下文棧的變化不一樣,然而回答的太籠統,本片詳細解析執行上下文棧和執行上下文具體變化過程
具體執行分析
第一段**執行過程:
1.執行全域性**,建立全域性執行上下文,全域性執行上下文被壓入執行上下文棧
ecstack = [
globalcontext
];
2.全域性上下文初始化
globalcontext =
3.全域性上下文初始化的同時,checkscope函式被建立,儲存作用域鏈到函式的內部屬性[[scope]]
checkscope.[[scope]] = [
globalcontext.vo
];
4.執行checkscope函式,建立checkscope函式執行上下文,並壓入棧
ecstack = [
checkscopecontext,
globalcontext
];
5.checkscope函式執行上下文初始化:
①複製函式[[scope]]屬性建立作用域鏈
②用arguments建立活動物件
③初始化活動物件,即加入形參、函式宣告、變數宣告
④將活動物件壓入checkscope作用域鏈頂端
同時f函式被建立,儲存checkscope作用域鏈到f函式內部屬性[[scope]]
checkscopecontext = ,
scope:undefined,
f:reference to function f(){}
},scope:[ao,globalcontext.vo],
this:undefined
}
6.執行f函式,建立f函式執行上下文並壓入棧
ecstack = [
fcontext,
checkscopecontext,
globalcontext
];
7.f函式執行上下文初始化,跟上面一樣:
①複製函式[[scope]]屬性建立作用域鏈
②用arguments建立活動物件
③初始化活動物件,即加入形參、函式宣告、變數宣告
④將活動物件壓入f作用域鏈頂端
fcontext =
},scope:[ao,checkscopecontext.ao,globalcontext.vo],
this.undefined
}
8.f函式執行,沿這作用域鏈查詢scope值並返回
9.f函式執行完畢,f函式上下文從執行上下文棧中彈出
ecstack = [
checkscopecontext,
globalcontext
];
10.checkscope函式執行完畢,checkscope執行上下文從執行上下文棧中彈出
ecstack = [
globalcontext
];
第二段**就留給大家去嘗試模擬它的執行過程 執行上下文
1.分類 位置 全域性 函式 區域性 2.全域性執行上下文 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 this 賦值 w...
this執行上下文
this的指向為 誰呼叫當前this所在的函式,this就指向誰。也就是說,當前呼叫函式的那個物件自身就是this,就是當前的執行上下文。被滑鼠事件,鍵盤事件等觸發的函式 叫做事件處理函式,事件處理函式的this指向事件源 觸發事件的節點 事件處理函式第乙個引數是事件物件 備註 有名函式的this指...
執行上下文
js原理 原型鏈 執行上下文 事件迴圈 預備知識 1 棧 stack 棧是類似於陣列的一種資料結構。2物件引用 user1指向使用者物件 user1持有使用者物件的引用 var user1 var user2 user1 user2.name 張三 console.log user1.name,us...