變量和做用域以及內存問題

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

 

內存中的未知: 1/由於基本類型數據是簡單類型數據執行時建立在棧內存中便可,2/object是複雜類型數據佔內存多因此保存在堆內存中以便於其餘變量進行引用;java

 

執行環境及做用域:web

  執行環境定義了變量有權限的訪問其餘數據,並決定他們各自的行爲。每個執行環境都有一個與之相關的變量對象相配,在這個變量中定義了全部該執行環境中的全部屬性和方法。雖然咱們無法訪問這個變量,可是在解析器處理數據的時候會使用到它。瀏覽器

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

局部的執行環境:每個函數都有本身的執行環境,當一個函數開始執行的時候會被壓入執行棧,執行棧執行先入後出的規則,即先進入執行棧的函數是最外層的函數,最後進入執行棧的函數是最內部的函數,由於有棧規則也決定了,javascript的做用域鏈是從內部向外層查找的過程。由於外層相對於內層後被銷燬。ECMAscript也是運用這個機制來處理執行流的。優化

垃圾回收:線程

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

  2/引用計數:當一個變量被另外一個變量引用則計數1,沒有被引用的變量被計數0,在早期的Navigator2中時候了這種引用計數,可是出現了重大的bug產生了極大的內存浪費,對象

    如: var a = {b:b};生命週期

      var b = {a:a};

      對象之間的相互引用,計數爲2,不會被垃圾回收器回收。

內存管理:

  因爲系統分配給瀏覽器的內存相對於其餘桌面應用小的多,內存限制問題不只會影響到變量的內存分配,還會影響到調用棧以及一個線程可同時執行語句的數量。

    內存優化的最佳方案就是,手動清除不須要的引用,將變量設置爲空指針 null。

相關文章
相關標籤/搜索