天天看點

JavaScript 執行環境 & 作用域

執行環境

執行環境定義了變量或函數有權通路的其他資料,決定了它們各自的行為。每個執行環境都有一個對應的變量對象,環境中定義的所有變量和函數都儲存在這個對象中,雖然我們編寫的代碼無法通路這個對象,但是解析器在處理資料時會用到。

全局執行環境是最外圍的一個執行環境,通常為 window 對象。某個執行環境中的所有代碼執行完畢之後,該環境被銷毀,儲存在其中的變量和函數也随之銷毀;全局執行環境直到應用程式退出,例如關閉網頁或浏覽器時才會被銷毀。

每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。 而在函數執行之後,棧将其環境彈出,把控制權傳回給之前的執行環境。ECMAScript 程式中的執行流 正是由這個友善的機制控制着。

作用域

當代碼在一個環境中執行時,會建立變量對象的一個作用域鍊。作用域鍊的用途事保證對執行環境有權通路的所有變量和函數的有序通路。作用域鍊的前端,都是目前執行的代碼所在的環境的變量對象。

如果這個環境是函數,則将其活動對象作為變量對象。活動對象最開始隻包含一個變量,即 arguments 對象。作用域鍊中的下一個變量對象來自包含(外部)環境,在下一個變量對象來自下一個包含環境,直至全局執行環境。全局執行環境的變量對象始終都是作用域鍊的最後一個變量對象。

辨別符解析是沿着作用域鍊一級一級搜尋辨別符的過程。搜尋過程始終從作用域鍊的前端開始,然後逐級向後,直至找到辨別符為止。

繼續閱讀