1.執行環境
- 執行環境定義了變量或函數有權訪問的其他數據,并決定他們各自的行為。
- 每個執行環境都有一個與之相關聯的變量對象,環境中定義的所有變量和函數都保存在這個對象中。
- 某個執行環境中的所有代碼執行完畢后,該環境被銷毀,保存在其中的變量和函數定義也隨之銷毀。
2.執行上下文
- 每次當控制器轉到ECMAScript可執行代碼的時候,即會進入到一個執行上下文。
- 執行上下文是ECMA-262標準里的一個抽象概念,用于同可執行代碼概念進行區分。
- 活動的執行上下文組在邏輯上組成一個堆棧,堆棧底部永遠都是全局上下文,而頂部就是當前執行上下文。
3.作用域
- 作用域是一個函數在執行時期的執行環境。
- ES6得作用域中不存在聲明提前
- 變量要在聲明后使用,否則報錯。
4.作用域鏈
- 當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。
- 作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。
- 活動對象最開始時只包含一個變量,即arguments對象。
- 全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。
- 在局部作用域中定義的變量可以在局部環境中與全局變量相互使用。
5.延長作用域鏈
- try-catch語句中的catch塊:創建一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明。
- with語句:將指定的對象添加到作用域鏈中 。
6.塊級作用域
作用場景:
- 內存變量可能會覆蓋外層變量。
- 用來計數的循環變量泄露為全局變量。
7.閉包
- 指有權訪問另一個作用域鏈中的函數
- 讀取函數內部的局部變量;易造成變量污染。
- 變量的值保存在內存中,不會被垃圾回收機制回收;易造成內存泄漏。
8.垃圾收集策略
- 標記清除:當變量進入環境時,就將這個變量標記為“進入變量”。
- 引用計數:跟蹤記錄每個值被引用的次數,當這個值的引用次數變成0時,將其占用的內存空間回收。