JS 變數提公升 執行上下文 作用域鏈

2022-09-24 06:36:09 字數 1521 閱讀 3109

一、執行上下文(execute context)ec

理解:**的執行環境

時機:**正式執行之前會進入到執行環境,**執行結束銷毀

工作:1.建立變數物件

(1)變數

(2)函式及函式的引數

(3)全域性:window

(4) 區域性:抽象的但是確實存在

2.確認this指向

(1)全域性:this ---> window

(2) 區域性:this----> 呼叫其的物件

3.建立作用域鏈

當前變數物件+父級作用域鏈+。。。

4.擴充套件:

ecobj = ,

scopechain:父級作用域鏈 + 當前的變數物件,

this:

}二、 作用域鏈:上下文中**執行時會建立變數物件的乙個作用域鏈。

作用域鏈決定者各級上下文中**訪問變數和函式的順序。

**正在執行的上下文的變數物件始終位於作用域鏈的最前端。

作用域鏈的下乙個變數物件來自包含上下文,再下乙個變數物件來自下乙個包含上下文。

以此類推直至全域性上下文,全域性上下文的變數物件始終是作用域鏈的最後乙個變數物件。

作用域鏈增強:執行上下文主要有全域性上下文和函式上下文兩種(eval()呼叫內部存在第三種上下文),

但有其他方式來增強作用域鏈。某些語句會導致在作用域鏈前端臨時新增乙個上下文,

這個上下文在**執行後會被刪除 。

(1)try/catch語句的catch塊

(2)with語句

一、執行上下文(execute context)ec

理解:**的執行環境

時機:**正式執行之前會進入到執行環境,**執行結束銷毀

工作:1.建立變數物件

(1)變數

(2)函式及函式的引數

(3)全域性:window

(4) 區域性:抽象的但是確實存在

2.確認this指向

(1)全域性:this ---> window

(2) 區域性:this----> 呼叫其的物件

3.建立作用域鏈

當前變數物件+父級作用域鏈+。。。

4.擴充套件:

ecobj = ,

scopechain:父級作用域鏈 + 當前的變數物件,

this:

}二、 作用域鏈:上下文中**執行時會建立變數物件的乙個作用域鏈。

作用域鏈決定者各級上下文中**訪問變數和函式的順序。

**正在執行的上下文的變數物件始終位於作用域鏈的最前端。

作用域鏈的下乙個變數物件來自包含上下文,再下乙個變數物件來自下乙個包含上下文。

以此類推直至全域性上下文,全域性上下文的變數物件始終是作用域鏈的最後乙個變數物件。

作用域鏈增強:執行上下文主要有全域性上下文和函式上下文兩種(eval()呼叫內部存在第三種上下文),

但有其他方式來增強作用域鏈。某些語句會導致在作用域鏈前端臨時新增乙個上下文,

這個上下文在**執行後會被刪除 。

(1)try/catch語句的catch塊

(2)with語句

執行上下文(棧) 作用域(鏈)

執行上下文 首先按照 的位置分類可以分成兩種 全域性 以及函式 區域性 全域性執行上下文 開始執行全域性 函式執行上下文 開始執行函式體 執行上下文棧 在全域性 執行前,js引擎會建立乙個棧來儲存管理所有的執行上下文物件 在全域性執行上下文 window確定後 將其新增到棧中 壓棧 在函式執行上下文...

11 變數提公升 執行上下文

變數公升級 預處理 js引擎在 正式執行之前會做乙個預處理的工作 1.收集變數 2.收集函式 依據 var 將var後邊的變數定義但不賦值 var username undefined function console.log username 答案 underfined var username ...

作用域和執行上下文

當全域性 開始執行前,先建立全域性執行上下文環境 2.當全域性執行上下文環境建立好了以後將上下文中的所有內容放入棧記憶體 3.最先放入的在最下邊 global 4.其他執行的函式的執行上下文依次放入 放入的順序是 的執行順序 5.棧中最後放入的執行完最先出棧。6.1.除全域性作用域之外,每個函式都會...