執行上下文

2021-10-18 22:56:29 字數 1634 閱讀 3946

1.**分類(位置)

*全域性**

*函式(區域性)**

2.全域性執行上下文

*在執行全域性**前,將window確定為全域性執行上下文

*對全域性資料進行預處理

*var定義的全域性變數 => undefined , 新增為window的屬性

*function宣告的全域性函式 => 賦值(fun),新增為window的方法

*this => 賦值(window)

*開始執行全域性**

//全域性執行上下文

console.

log(a1,window.a1)

;//undefined undefineda2(

);//a2()

console.

log(

this);

var a1 =3;

functiona2(

) console.

log(a1)

;//3

3.函式執行上下文

*在呼叫函式,準備執行函式體之前,建立對應的函式執行上下文物件 (虛擬的,存在於棧中)

*對區域性資料進行預處理

*形參變數 => 賦值(實參) => 新增為執行上下文的屬性

*arguments => 賦值(實參列表), 新增為執行上下文的屬性

*var定義的區域性變數 => undefined , 新增為執行上下文的屬性

*function宣告的函式 => 賦值(fun) , 新增為執行上下文的方法

*this => 賦值(呼叫函式的物件)

*開始執行函式體**

//函式執行上下文例子

function

fn(a1)}fn

(2,3

);

4,*在全域性**執行前,js引擎就會建立乙個棧來儲存管理所有的執行上下文物件(環境)

*在全域性執行上下文(window)確定後,將其新增到棧中(壓棧)

*在函式執行上下文建立後,將其新增到棧中(壓棧)

*在當前函式執行完後,將棧頂的物件移除(出棧)

*當所有的**執行完後,棧中只剩下window

5.測試題:

1.

functiona(

)var a ;

console.

log(

typeof a)

;//'function' ,因為先執行變數宣告提公升,再執行函式宣告提公升

2.if(!

(b in window)

) console.

log(b)

;//undefined ,因為b在預處理時,就已經成為window的屬性,所以沒有被進行賦值為「1」的操作

3.var c =1;

function

c(c)c(

2);//報錯,因為c不是函式,原因在於在執行上下文物件中,預處理時 ,var c 先將c變數定義為undefined,然後再賦值c為「1」 ,所以c不是函式;

//等價於:

var c = undefined ;

function

c(c)

c =1;

c(2)

;

執行上下文

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