1. 程式人生 > >《JavaScript高階程式設計》學習筆記(2)——第四章 變數、作用域和記憶體問題

《JavaScript高階程式設計》學習筆記(2)——第四章 變數、作用域和記憶體問題

基本型別和引用型別的值

  • 基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。
  • 區域性物件會在函式執行完畢後立即被銷燬。
  • 檢測型別:instanceof操作符
result = variable instanceof constructor

如果變數是給定引用型別(根據它的原型鏈來識別)的例項,那麼instanceof 操作符就會返回 true 

執行環境及作用域

  • 全域性執行環境是最外圍的一個執行環境。根據 ECMAScript 實現所在的宿主環境不同,表示執行環境的物件也不一樣。在 Web 瀏覽器中,全域性執行環境被認為是 window 物件。
  • 執行流進入一個函式時,函式的環境就會被推入一個環境棧
    中。而在函式執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。
  • 當代碼在一個環境中執行時,會建立變數物件的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有變數和函式的有序訪問
  • 延長作用域鏈,就是當執行流進入下列任何一個語句時,作用域鏈就會得到加長:
     try-catch 語句的 catch 塊
     with 語句

垃圾收集

  • JavaScript 中最常用的垃圾收集方式是標記清除(mark-and-sweep)。
當變數進入環境(例如,在函式中宣告一個變數)時,就將這個變數標記為“進入環境”。而當變數離開環境時,則將其標記為“離開環境”。最後,垃圾收集器完成記憶體清除工作,銷燬那些帶標記的值並回收它們所佔用的記憶體空間。
  • 另一種不太常見的垃圾收集策略叫做引用計數
    (reference counting)。引用計數的含義是跟蹤記錄每個值被引用的次數。

引用計數的含義是跟蹤記錄每個值被引用的次數。當聲明瞭一個變數並將一個引用型別值賦給該變數時,則這個值的引用次數就是 1。如果同一個值又被賦給另一個變數,則該值的引用次數加 1。相反,如果包含對這個值引用的變數又取得了另外一個值,則這個值的引用次數減 1。當這個值的引用次數變成 0 時,則說明沒有辦法再訪問這個值了,因而就可以將其佔用的記憶體空間回收回來。這樣,當垃圾收集器下次再執行時,它就會釋放那些引用次數為零的值所佔用的記憶體。

  • IE 的垃圾收集器是根據記憶體分配量執行的。隨著 IE7 的釋出,其 JavaScript 引擎的垃圾收集例程改變了工作方式:觸發垃圾收集的變數分配、字面量和(或)陣列元素的臨界值被調整為動態修正。
  • 一旦資料不再有用,最好通過將其值設定為 null 來釋放其引用——這個做法叫做解除引用(dereferencing)。