1、什麼是垃圾回收瀏覽器
JS垃圾回收機制的目的是爲了防止內存泄漏,內存泄漏是指有一些已經不被須要的變量但仍然存在在內存中,這樣便會形成內存泄漏。垃圾回收機制就是爲了回收這些不被須要的變量,而且釋放掉他們所指向的內存。函數
Java、JavaScript等一些語言有垃圾回收機制,可是C\C++沒有。其實我也不是很清楚爲何會有這樣的區別。請知道的dalao能夠評論告訴我一下!!!謝謝麼麼噠spa
2、JS垃圾回收的方法code
- 標記清除
- 這是最多見的回收方法,也是大部分瀏覽器使用的回收方法。
- 當變量進入執行環境是,就會被標記上「進入環境」,從邏輯上講,被標記上「進入環境」的變量所指向的內存是永遠不會被回收的。當某個變量離開執行環境時,就會被標上「離開環境」。被標記爲「離開環境」的變量則是能夠回收的。
function func() { const a = 1; const b = 1; // 此時變量a, b 分別被標記爲 進入環境 } func(); // 函數執行完畢,a, b 被標記爲 離開環境,此時a, b 被回收
- 引用計數
- 這是一種不太常見的回收方式。引用計數法就是同級引用類型聲明後被引用的次數,當次數爲0時,該變量就會被回收。
- 存在缺點,會存在內存泄漏。
// 正常的引用計數 function func() { const c = {}; let d = c; // c 被 d 引用一次,c的引用計數爲 1 let e = c; // c 被 e 引用一次,c的引用計數爲 2 d = {}; // d 再也不引用c,c的引用計數減爲 1 e = null; // e 也不在引用c,c的引用計數減爲 0,此時c將會被回收 } // 有缺陷的引用計數,內存泄漏 function func() { let f = {}; let g = {}; f.prop = g; g.prop = f; // 因爲 f 和 g 相互引用,計數永遠不爲0 }
3、有可能形成內存泄漏的案例blog
- 全局變量形成的內存泄漏
- 未銷燬的定時器和回調函數形成的內存泄漏
- DOM引用形成的內存泄漏
var elements = { txt: document.getElementById('test'); } function fn(){ elements.txt.innerHTML = '11111'; } function removeTxt(){ document.body.removeChild(document.getElementById('test')); } fn(); removeTxt(); console.log(element.txt); // <div id='test'>11111</div> // 雖然咱們已經移除了id爲text的元素,但咱們認爲沒法對此進行回收。