1. 程式人生 > >js垃圾回收機制

js垃圾回收機制

朋友 循環 不同 單點 閉包 obj 計數 outer 在一起

通過鏈接過來的朋友知道閉包存在內存不清除問題,也就是局部變量本來要自動清除的,現在不清除了,那麽這個清除是怎麽個清除法?

手動清除法:適用於閉包不用了的情況下

function outer() {
        var a = 1;
      return function inner() {
            a = a + 1;
            console.log(a)
        }
    }
    // fn和inner函數連在一起,不能自動清理a
    var fn = outer();
   //  不用閉包了,跟inner斷開聯系
fn = null

標記-清除法(瀏覽器默認,有內存儲存不連續缺點):說的簡單點,不同瀏覽器都是固定時間清理一次,清理那些不再需要的變量,只不過不同瀏覽器的時間不同而已,都說了是標記-清除,首先要標記。【CG算法】(共軛梯度)(叠代)

標記:從windows全局對象開始往下找,找到了做個標記,做什麽標記不重要(紅寶書),沒找到的也就是沒標記的都要清除。也就是為什麽把outer()給全局fn就不用清除a了呢,因為賦值給fn,windows下找到了fn,fn又找到了a所以清除不了。

清除:垃圾清理器清理就好

引用計數法(循環引用無法清除):記錄引用次數,0次就可以清除了,循環引用是致命的

,所以瀏覽器都拋棄了引用計數法

var obj1 = {
        fn: function(a) {
          console.log(a);
        }
      };
      var obj2 = {
        fn: function(b){
            console.log(b);  
        }
      };
      // obj1引用了obj2,obj2引用了obj1,引用計數法無法清除
      obj1.fn(obj2)
      obj2.fn(obj1)

js垃圾回收機制