1. 執行上下文:
Execution Content:函式執行前的準備工作
2. JS執行環境
* 全域性作用域
* 函式作用域
* eval作用域(不推薦使用eval,暫時忽略)
* 塊級作用域 ES6新增
複製程式碼
3. JS是如何管理執行上下文?
通過棧(先進後出,後進先出的一種資料結構)的存取方式管理,稱為"執行棧"或"呼叫棧"
4. 函式呼叫棧
js執行 最先進入全域性環境,所以處於"棧底的永遠是全域性環境的執行上下文",出於"棧頂的是當前正在執行函式的執行上下文",當函式呼叫完成後,它就會從棧頂被推出去(出棧,閉包會阻止)
注意: 全域性環境只有一個,對應的全域性執行上下文也只有一個,只有當頁面被關閉之後它才會從執行棧出棧,否則一直存在於棧底。
5. 執行上下文的生命週期
1.建立階段: 函式被呼叫時,進入函式環境,建立執行上下文。
2.執行階段: 函式中的程式碼執行時,執行上下文進入執行階段
建立階段:
1. 建立變數物件
1.1 Arguments 物件(已賦值)
1.2 函式宣告 (已賦值)
1.3 變數宣告,函式表示式宣告(未賦值)
2. 確定this (呼叫者確定)
3. 確定作用域(詞法環境決定)
執行階段:
1. 變數物件賦值
1.1 變數賦值
1.2 函式表示式賦值
2. 呼叫函式
3. 順序執行其他程式碼
複製程式碼
6. 變數物件和活動物件的區別?:
當進入到一個執行上下文後,這個變數物件才會被啟用,所以叫活動物件(AO),這時候活動物件上的各種屬性才能被訪問。
注意:建立階段對函式宣告做賦值,變數及函式表示式僅做宣告,真正的賦值操作要等到行上下文程式碼執行階段。