Execution Content:函數執行前的準備工做git
* 全局做用域
* 函數做用域
* eval做用域(不推薦使用eval,暫時忽略)
* 塊級做用域 ES6新增
複製代碼
經過棧(先進後出,後進先出的一種數據結構)的存取方式管理,稱爲"執行棧"或"調用棧"github
js執行 最早進入全局環境,因此處於"棧底的永遠是全局環境的執行上下文",出於"棧頂的是當前正在執行函數的執行上下文",當函數調用完成後,它就會從棧頂被推出去(出棧,閉包會阻止)數據結構
注意: 全局環境只有一個,對應的全局執行上下文也只有一個,只有當頁面被關閉以後它纔會從執行棧出棧,不然一直存在於棧底。閉包
1.建立階段: 函數被調用時,進入函數環境,建立執行上下文。
2.執行階段: 函數中的代碼執行時,執行上下文進入執行階段
建立階段:
1. 建立變量對象
1.1 Arguments 對象(已賦值)
1.2 函數聲明 (已賦值)
1.3 變量聲明,函數表達式聲明(未賦值)
2. 肯定this (調用者肯定)
3. 肯定做用域(詞法環境決定)
執行階段:
1. 變量對象賦值
1.1 變量賦值
1.2 函數表達式賦值
2. 調用函數
3. 順序執行其餘代碼
複製代碼
當進入到一個執行上下文後,這個變量對象纔會被激活,因此叫活動對象(AO),這時候活動對象上的各類屬性才能被訪問。函數
注意:建立階段對函數聲明作賦值,變量及函數表達式僅作聲明,真正的賦值操做要等到行上下文代碼執行階段。this
原文連接spa