天天看點

JavaScript進階程式設計(讀書筆記)(四)第四章 變量、作用域和記憶體問題

本筆記彙總了作者認為“JavaScript進階程式設計”這本書的前七章知識重點,僅供參考。

第四章 變量、作用域和記憶體問題

JavaScript變量可以用來儲存兩種類型的值:基本類型值和引用類型值。基本類型的值源自以下5種基本資料類型:Undefined、Null、Boolean、Number和String。基本類型值和引用類型值具有以下特點:
  • 基本類型值在記憶體中占據固定大小的空間,是以被儲存在棧記憶體中;
  • 從一個變量向另一個變量複制基本類型的值,會建立這個值的一個副本;
  • 引用類型的值是對象,儲存在堆記憶體中;
  • 包含引用類型值的變量實際上包含的并不是對象本身,而是一個指向該對象的指針;
  • 從一個變量向另一個變量複制引用類型的值,複制的其實是指針,是以兩個變量最終都指向同一個對象;
  • 确定一個值是哪種基本類型可以使用typeof操作符,而确定一個值是哪種引用類型可以使用instanceof操作符。
所有變量(包括基本類型和引用類型)都存在于一個執行環境(也成為作用域)當中,這個執行環境決定了變量的生命周期,以及哪一部分代碼可以通路其中的變量。以下是關于執行環境的幾點總結:
  • 執行環境有全局執行環境(也成為全局環境)和函數執行環境之分;
  • 每次進入一個新執行環境,都會建立一個用于搜尋變量和函數的作用域鍊;
  • 函數的局部環境不僅有權通路函數作用域中的變量,而且有權通路其包含(父)環境,乃至全局環境;
  • 全局環境隻能通路在全局環境中定義的變量和函數,而不能直接通路局部環境中的任何資料;
  • 變量的執行環境有助于确定應該何時釋放記憶體。
JavaScript是一門具有自動垃圾收集機制的程式設計語言,開發人員不必關心記憶體配置設定和回收問題。可以對JavaScript的垃圾收集例程作如下總結:
  • 離開作用域的值将被自動标記為可以回收,是以将在垃圾收集期間被删除。
  • “标記清除”是目前主流的垃圾收集算法,這種算法的思想是給目前不使用的值加上标記,然後再回收其記憶體。
  • 另一種垃圾收集算法是“引用計數”,這種算法的思想是跟蹤記錄所有制被引用的次數。JavaScript引擎目前都不再使用這種算法;但在IE中通路非原生JavaScript對象(如DOM元素)時,這種算法仍然可能會導緻問題。
  • 當代碼中存在循環引用現象時,“引用計數”算法就會導緻問題。
  • 解除變量的引用不僅有助于消除循環引用現象,而且對垃圾收集機制也有好處。為了確定有效地回收記憶體,應該及時解除不再使用的全局對象、全局對象屬性以及循環引用變量的引用。

需要注意的是,在JavaScript中,String為基本類型,如果有C++或者Java程式設計經驗,會發現這一點不同于以前我們的認知。

繼續閱讀