執行上下文
1. **分類(位置)
* 全域性**
* 函式(區域性)**
2. 全域性執行上下文
* 在執行全域性**前將window確定為全域性執行上下文
* 對全域性資料進行預處理
* var定義的全域性變數==>undefined, 新增為window的屬性
* function宣告的全域性函式==>賦值(fun), 新增為window的方法
* this==>賦值(window)
* 開始執行全域性** //
3. 函式執行上下文
* 在呼叫函式, 準備執行函式體之前, 建立對應的函式執行上下文物件(虛擬的, 存在於棧中)
* 對區域性資料進行預處理
* 形參變數==>賦值(實參)==>新增為執行上下文的屬性
* arguments==>賦值(實參列表), 新增為執行上下文的屬性
* var定義的區域性變數==>undefined, 新增為執行上下文的屬性
* function宣告的函式 ==>賦值(fun), 新增為執行上下文的方法
* this==>賦值(呼叫函式的物件)
* 開始執行函式體**
4執行上下文棧
1. 在全域性**執行前, js引擎就會建立乙個棧來儲存管理所有的執行上下文物件
2. 在全域性執行上下文(window)確定後, 將其新增到棧中(壓棧)
3. 在函式執行上下文建立後, 將其新增到棧中(壓棧)
4. 在當前函式執行完後,將棧頂的物件移除(出棧)
5. 當所有的**執行完後, 棧中只剩下window
5:面試題目
測試題1: 先執行變數提公升, 再執行函式提公升
function a() {}
var a
console.log(typeof a) // 'function'
測試題2:
if (!(b in window)) c=1,c是乙個數值不是函式物件
c(2) // 報錯
//面試題:
funcution fun()
console.log(b)//b是全域性變數 var a是區域性變數 b=3;a=undefine
6:作用域和作用域鏈
1. 理解
* 就是一塊"地盤", 乙個**段所在的區域
* 它是靜態的(相對於上下文物件), 在編寫**時就確定了
2. 分類
* 全域性作用域
* 函式作用域
* 沒有塊作用域(es6有了)
3. 作用
* 隔離變數,不同作用域下同名變數不會有衝突
1. 區別1
* 全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了。而不是在函式呼叫時
* 全域性執行上下文環境是在全域性作用域確定之後, js**馬上執行之前建立
* 函式執行上下文是在呼叫函式時, 函式體**執行之前建立
2. 區別2
* 作用域是靜態的, 只要函式定義好了就一直存在, 且不會再變化
* 執行上下文是動態的, 呼叫函式時建立, 函式呼叫結束時就會自動釋放
3. 聯絡
* 執行上下文(物件)是從屬於所在的作用域
* 全域性上下文環境==>全域性作用域
* 函式上下文環境==>對應的函式使用域
1. 理解
* 多個上下級關係的作用域形成的鏈, 它的方向是從下向上的(從內到外)
* 查詢變數時就是沿著作用域鏈來查詢的
2. 查詢乙個變數的查詢規則
* 在當前作用域下的執行上下文中查詢對應的屬性, 如果有直接返回, 否則進入2
* 在上一級作用域的執行上下文中查詢對應的屬性, 如果有直接返回, 否則進入3
* 再次執行2的相同操作, 直到全域性作用域, 如果還找不到就丟擲找不到的異常
3:面試題 x=10
作用域和執行上下文
當全域性 開始執行前,先建立全域性執行上下文環境 2.當全域性執行上下文環境建立好了以後將上下文中的所有內容放入棧記憶體 3.最先放入的在最下邊 global 4.其他執行的函式的執行上下文依次放入 放入的順序是 的執行順序 5.棧中最後放入的執行完最先出棧。6.1.除全域性作用域之外,每個函式都會...
作用域和上下文
作用域分為全域性作用域和區域性作用域。區域性作用域中可訪問全域性變數,但是全域性作用域中無法訪問某一區域性作用域中的區域性變數。上下文常常代表this變數的值及其指向,它決定乙個函式怎麼被呼叫,但乙個函式被作為物件的乙個方法被呼叫的時候,this總是指向呼叫這個方法的物件。this往往指向當前函式的...
作用域和上下文
上下文 this變數的值,以及他的指向。function pet words pet 全域性呼叫 js中this指向函式的擁有者,通常將擁有者叫執行上下文。this只能在函式內部使用。this指向 1 函式擁有者 2 全域性 3 在建構函式中的this,是指向新建立的例項物件 上下文可以在執行環境中...