關於JavaScript的學習(四)——變量、作用域和內存問題

第四章

1.基本類型值和引用類型值的特點:

  • 基本類型值在內存中佔據固定大小的空間,因此被保存在棧內存中;
  • 從一個變量向另一個變量複製基本類型的值,會創建這個值的一個副本;
  • 引用類型的值是對象,保存在堆內存中;
  • 包含引用類型值的變量實際上包含的並不是對象本身,而是一個指向該對象的指針
  • 從一個變量向另一個變量複製引用類型的值,複製的其實是指針,因此兩個變量始終指向一個對象
     var obj1 = new Object();
     var obj2 = obj1;
     obj1.name = "Nicholas";
     alert(obj.name);               //"Nicholas"
  • 確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符。

2.所有的變量(包括基本類型和引用類型)都存在於一個執行環境(也稱爲作用域)當中,這個執行環境決定了變量的生命週期,以及哪一部分代碼可以訪問其中的變量:

  • 執行環境有全局執行環境(也稱爲全局環境)和函數執行環境之分;
  • 每次進入一個新的執行換屆,都會創建一個用於搜索變量和函數的作用域鏈;
  • 函數的局部環境不僅有權訪問函數作用域中的變量,而且有權訪問其包含(父)環境,乃至全局環境;
  • 全局環境只能訪問在全局環境中定義的變量和函數, 而不能直接訪問局部環境中的任何數據;
  • 變量的執行環境有助於確定應該何時釋放內存。

3.JavaScript是一門具有自動垃圾收集機制的編程語言,開發人員不必關心內存分配和回收問題

  • 離開作用域的值將被自動標記爲可以回收,因此將在垃圾收集期間被刪除。
  • “標記清除”是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然後再回收其內存。
  • 另一種垃圾收集算法是“引用計數”,這種算法的思想是跟蹤記錄所有值被引用的次數。JavaScript引擎目前都不再使用這種算法。但在IE中訪問非原生JavaScript 對象(如DOM元素)時,這種算法仍然可能會導致問題。
  • 當代碼中存在循環引用現象時,“引用計數”算法就會導致問題。
  • 解除變量的引用不僅有助於消除循環引用現象,而且對垃圾收集也有好處。爲了確保有效地回收內存,應該及時解除不再使用的全局對象、全局對象屬性以及循環引用變量的引用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章