作用域鏈和閉包

1.執行環境

  1. 執行環境定義了變量或函數有權訪問的其他數據,并決定他們各自的行為。
  2. 每個執行環境都有一個與之相關聯的變量對象,環境中定義的所有變量和函數都保存在這個對象中。
  3. 某個執行環境中的所有代碼執行完畢后,該環境被銷毀,保存在其中的變量和函數定義也隨之銷毀。

2.執行上下文

  1. 每次當控制器轉到ECMAScript可執行代碼的時候,即會進入到一個執行上下文。
  2. 執行上下文是ECMA-262標準里的一個抽象概念,用于同可執行代碼概念進行區分。
  3. 活動的執行上下文組在邏輯上組成一個堆棧,堆棧底部永遠都是全局上下文,而頂部就是當前執行上下文。

3.作用域

  1. 作用域是一個函數在執行時期的執行環境。
  2. ES6得作用域中不存在聲明提前
  3. 變量要在聲明后使用,否則報錯。

4.作用域鏈

  1. 當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。
  2. 作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。
  3. 活動對象最開始時只包含一個變量,即arguments對象。
  4. 全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。
  5. 在局部作用域中定義的變量可以在局部環境中與全局變量相互使用。

5.延長作用域鏈

  1. try-catch語句中的catch塊:創建一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明。
  2. with語句:將指定的對象添加到作用域鏈中 。

6.塊級作用域

作用場景:

  1. 內存變量可能會覆蓋外層變量。
  2. 用來計數的循環變量泄露為全局變量。

7.閉包

  1. 指有權訪問另一個作用域鏈中的函數
  2. 讀取函數內部的局部變量;易造成變量污染。
  3. 變量的值保存在內存中,不會被垃圾回收機制回收;易造成內存泄漏。

8.垃圾收集策略

  1. 標記清除:當變量進入環境時,就將這個變量標記為“進入變量”。
  2. 引用計數:跟蹤記錄每個值被引用的次數,當這個值的引用次數變成0時,將其占用的內存空間回收。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容