通過鏈接過來的朋友知道閉包存在內存不清除問題,也就是局部變量本來要自動清除的,現在不清除了,那么這個清除是怎么個清除法?
手動清除法:適用於閉包不用了的情況下
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)
最后說一下內存泄露(以后沒用又清除不了)的幾種常見情況:全局變量(無法被回收機制清除,不知道以后會不會還會用),閉包(感覺本質上還是全局變量不能回收引起的),(DOM清除下)事件未清理