1. 程式人生 > >【學習筆記】四:變數、作用域和記憶體問題

【學習筆記】四:變數、作用域和記憶體問題

1.引用型別的值

   引用型別的值是指儲存在記憶體中的物件,JavaScript不允許直接訪問記憶體中的位置,因此在操作物件時,實際上是操作的引用而不是實際的物件。(嚴密的說法是:當複製儲存著物件的某個變數時,操作的是物件的引用。但為物件新增屬性時,操作的是實際物件)。

  1)引用型別可以動態新增屬性。

  2)引用型別在複製變數值時,複製的是物件的指標,新複製的變數和原來的變數儲存的值只想記憶體中的同一個物件,因此改變其一,另一 個也變。

  3)所有函式的引數都是按值傳遞的,包括引用型別的傳遞。引用型別傳遞的雖然是是物件的記憶體地址,但是在函式中如果引數的指向重新賦值後改變引數的屬性並不會引起所傳遞值得屬性,說明引用型別也是按值傳遞的。

  4)通過typeof檢測基本型別,通過instanceof檢測引用型別的值。

2.執行環境及作用域

  1)執行環境是一個變數或函式可以在其中操作的一個範圍環境(就是類C語言中的作用域),每一個執行環境都有一個與之關聯的變數物件,環境中的這些變數和函式都儲存在這個物件中。

     每個函式都有一個執行環境,函式在執行時會變推入一個環境棧中,函式執行後,棧將其彈出。

     變數物件的父子關係之間組成了一個作用域鏈。作用域鏈的最前端是當前活動物件,在尋找變數時首先在當前執行環境中尋找,如果找不到,到期上一級父環境中尋找,直至找到識別符號位置(如果找不到通常會導致錯誤發生)。

  2) 當使用try-catch語句的catch塊和with語句時存在作用域鏈延長的現象,會在作用域鏈的前端臨時增加一個變數物件(不過不常見)。

  3)JavaScript沒有塊級作用域,只有全域性執行環境和函式執行環境之分,不能像類C語言那樣中括號就可以確定一個作用域。如:if(true){

                    var color = "blue";

                   }

                  alert(color); //"blue"

    if 語句結束後,變數color依舊存在於if的執行環境中。

3.垃圾收集

  1)常用得了兩種回收策略:標記清除和引用計數(引用計數存在迴圈引用問題,基本上已經不採用了),但在IE9之前的IE瀏覽器訪問非原生JS物件(如DOM元素)時,依舊使用了這種可能存在問題的回收策略。

  2)效能問題:垃圾收集器的呼叫間隔影響效能。垃圾回收期的呼叫方式一般由瀏覽器自己判斷。

  3)系統為Web瀏覽器比較少,為了確保佔用最少的記憶體讓頁面獲得更好的效能,一旦全域性變數和全域性物件不再使用,最好將其設為null來釋放其引用,幫助垃圾收集器回收。