js執行環境總結

lq_prototype發表於2019-02-21

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),這時候活動物件上的各種屬性才能被訪問。

注意:建立階段對函式宣告做賦值,變數及函式表示式僅做宣告,真正的賦值操作要等到行上下文程式碼執行階段

7.執行上下文的數量限制(堆疊溢位)

原文連結

相關文章