1. 程式人生 > >變數和作用域以及記憶體問題

變數和作用域以及記憶體問題

在javascript中有五種基本型別:string/boolean/null/undefind/number,一種引用型別:object

 

記憶體中的未知: 1/因為基本型別資料是簡單型別資料執行時建立在棧記憶體中即可,2/object是複雜型別資料佔記憶體多所以儲存在堆記憶體中以便於其他變數進行引用;

 

執行環境及作用域:

  執行環境定義了變數有許可權的訪問其他資料,並決定他們各自的行為。每一個執行環境都有一個與之相關的變數物件相配,在這個變數中定義了所有該執行環境中的所有屬性和方法。雖然我們沒法訪問這個變數,但是在解析器處理資料的時候會使用到它。

  在 web瀏覽器中最外層物件是window,在window中定義的所有變數和函式都是作為 window物件的屬性和方法存在的。每一個執行環境都有自己的生命週期,生命週期一旦結束即會銷燬該環境的屬性和方法和環境本身。window物件的環境只有在關閉網頁退出瀏覽器時候才會被銷燬。

區域性的執行環境:每一個函式都有自己的執行環境,當一個函式開始執行的時候會被壓入執行棧,執行棧執行先入後出的規則,即先進入執行棧的函式是最外層的函式,最後進入執行棧的函式是最內部的函式,因為有棧規則也決定了,javascript的作用域鏈是從內部向外層查詢的過程。因為外層相對於內層後被銷燬。ECMAscript也是運用這個機制來處理執行流的。

垃圾回收:

  1/標記清除:當一個變數進入執行棧的時候,垃圾收集器會為他加一個標記,比如翻動變數的某一位,當出棧的時候清除這個標記。垃圾回收器週期性運轉清除沒有被標記的變數;

  2/引用計數:當一個變數被另一個變數引用則計數1,沒有被引用的變數被計數0,在早期的Navigator2中時候了這種引用計數,但是出現了重大的bug產生了極大的記憶體浪費,

    如: var a = {b:b};

      var b = {a:a};

      物件之間的相互引用,計數為2,不會被垃圾回收器回收。

記憶體管理:

  由於系統分配給瀏覽器的記憶體相對於其他桌面應用小的多,記憶體限制問題不僅會影響到變數的記憶體分配,還會影響到呼叫棧以及一個執行緒可同時執行語句的數量。

    記憶體優化的最佳方案就是,手動清除不需要的引用,將變數設定為空指標 null。