一、概念解析
1. 執行環境
是Js中最為重要的一個概念,執行環境定義了變量或者函數有權訪問的其他數據,決定了它們各自的行為。
執行環境分類
(1)全局執行環境
指的是全局的,不在任何函數里的代碼
全局執行環境是最外圍的一個執行環境。在 Web 瀏覽器中,全局執行環境被認為是 window 對象,因此所有全局變量和函數都是作為window對象的屬性和方法創建的。代碼載入瀏覽器時,全局執行環境被創建(當我們關閉網頁或者瀏覽器時全局執行環境才被銷毀)
(2)函數執行環境
在函數體內的代碼
每個函數都有自己的執行環境,當執行進入一個函數時,函數的執行環境就會被推入一個執行環境棧的頂部并獲取執行權。當這個函數執行完畢,它的執行環境又從這個棧的頂部被刪除,并把執行權并還給之前執行環境
2. 變量對象
每個執行環境都有一個與之關聯的變量對象,環境中定義的所有變量和函數都保存在這個對象中。
變量對象包含,var定義的變量, function定義的函數, 以及形參
例子:
<script type="text/javascript">
var color = "red";
function changeColor(color1) {
var color2 = color1;
}
changeColor(color)
</script>
對于這段代碼變量對象有兩部分:
通過變量聲明定義的變量color
通過函數聲明定義的函數 changeColor
3. 活動對象
如果這個環境是函數,則將其活動對象作為變量對象。活動對象是在進入函數的執行環境時創建的,并為該對象初始化一個 arguments 對象(這個對象在全局環境是不存在的?。?。
上面的代碼活動對象當執行changeColor函數時被創建:
- 初始化生成的 arguments 對象
- 通過變量聲明的變量 color2.
4. 作用域鏈
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。
當多個函數嵌套關系時,內層的函數可以訪問外層的變量,反之則不行。這就是作用域鏈的核心。解析過程是沿著作用域鏈一級一級從自身向外層搜索的。
圖片發自簡書App