深入 執行上下文

2021-09-02 20:31:14 字數 1986 閱讀 2381

在《深入--詞法作用域與動態作用域》中,提出這樣一道思考題

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...