1,執行環境(executioncontext)是javascript中非常重要的一個概念。執行環境定義了變量或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都保存在這個對象中,雖然我們編寫的代碼無法訪問這個對象,但是解析器在處理數據時會在后臺使用它。
2,全局執行環境是最外圍的一個執行環境。根據js所在的宿主環境不同,表示執行環境的對象也不一樣。在web瀏覽器中,全局執行環境被認為是window對象,因此所有全局變量和函數都是作為window對象的屬性和方法來創建的。某個執行環境中的所有代碼執行完畢后,該環境唄銷毀,保存在其中的所有變量和函數定義也隨之被銷毀(全局執行環境知道應用程序退出,例如關閉網頁或者瀏覽器時才會被銷毀)。
3,每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。而在函數執行之后,棧將其環境彈出,把控制權返回給之前的執行環境。js程序中的執行流正是由這個機制控制的。
4,當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈(scopechain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。如果這個環境是函數,則將其活動對象自以為變量對象。活動對象在最開始時只包含一個變量,即arguments對象(該對象在全局環境中是不存在的)。作用域鏈中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局環境,全局環境的變量對象始終是作用域鏈中的最后一個對象。
5,在作用域鏈中,內部環境可以通過作用域鏈來訪問所有的外部環境,但是外部環境不能訪問內部環境中的任何變量和函數。
6,使用var聲明的變量會自動被添加到最接近的環境中。在函數內部,最接近的環境就是函數的局部環境;如果初始化變量時沒有使用var聲明,該變量會自動被添加到全局環境。
7,訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。
本節源碼下載地址:JavaScript學習筆記(6):執行環境和作用域