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