執行上下文

2022-09-16 03:24:13 字數 2480 閱讀 5727

在《j**ascript深入之執行上下文棧》中講到,當 j**ascript **執行一段可執行**(executable code)時,會建立對應的執行上下文(execution context)。

對於每個執行上下文,都有三個重要屬性:

然後分別在《j**ascript深入之變數物件》、《j**ascript深入之作用域鏈》、《j**ascript深入之從ecmascript規範解讀this》中講解了這三個屬性。

因為,這一篇,我們會結合著所有內容,講講執行上下文的具體處理過程。

在《j**ascript深入之詞法作用域和動態作用域》中,提出這樣一道思考題:

var scope = "global scope";

function checkscope()

return f();

}checkscope();

var scope = "global scope";

function checkscope()

return f;

}checkscope()();

兩段**都會列印'local scope'。雖然兩段**執行的結果一樣,但是兩段**究竟有哪些不同呢?

我們分析第一段**:

var scope = "global scope";

function checkscope()

return f();

}checkscope();

執行過程如下:

1.執行全域性**,建立全域性執行上下文,全域性上下文被壓入執行上下文棧

ecstack = [

globalcontext

];

2.全域性上下文初始化

globalcontext = 

2.初始化的同時,checkscope 函式被建立,儲存作用域鏈到函式的內部屬性[[scope]]

checkscope.[[scope]] = [

globalcontext.vo

];

3.執行 checkscope 函式,建立 checkscope 函式執行上下文,checkscope 函式執行上下文被壓入執行上下文棧

ecstack = [

checkscopecontext,

globalcontext

];

4.checkscope 函式執行上下文初始化:

複製函式 [[scope]] 屬性建立作用域鏈,

用 arguments 建立活動物件,

初始化活動物件,即加入形參、函式宣告、變數宣告,

將活動物件壓入 checkscope 作用域鏈頂端。

同時 f 函式被建立,儲存作用域鏈到 f 函式的內部屬性[[scope]]

checkscopecontext = ,

scope: undefined,

f: reference to function f(){}

},scope: [ao, globalcontext.vo],

this: undefined

}

5.執行 f 函式,建立 f 函式執行上下文,f 函式執行上下文被壓入執行上下文棧

ecstack = [

fcontext,

checkscopecontext,

globalcontext

];

6.f 函式執行上下文初始化, 以下跟第 4 步相同:

複製函式 [[scope]] 屬性建立作用域鏈

用 arguments 建立活動物件

初始化活動物件,即加入形參、函式宣告、變數宣告

將活動物件壓入 f 作用域鏈頂端

fcontext = 

},scope: [ao, checkscopecontext.ao, globalcontext.vo],

this: undefined

}

7.f 函式執行,沿著作用域鏈查詢 scope 值,返回 scope 值

8.f 函式執行完畢,f 函式上下文從執行上下文棧中彈出

ecstack = [

checkscopecontext,

globalcontext

];

9.checkscope 函式執行完畢,checkscope 執行上下文從執行上下文棧中彈出

ecstack = [

globalcontext

];

第二段**就留給大家去嘗試模擬它的執行過程。

var scope = "global scope";

function checkscope()

return f;

}checkscope()();

執行上下文

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