實現方式:
1.標記清除
當變量進入環境時標記為 進入環境,離開環境時標記為 離開環境。正在被使用的變量不能回收也就是被標記為進入環境的產量。標記為 離開環境的變量可被回收。
function fn(){
//函數執行 a? b被標記為進入環境
? ? ? let a = 10;
? ? ? let b = 10;
}
fn();// 函數執行結束,ab被標記為離開環境,被回收。
2.引用計數
統計引用變量申明后被引用的次數,當次數為0時,變量被回收。
function fn2(){
? ? let c = {};
? ? let d = c;// c被d引用 c的計數為1
? ? let e = c;// c被e引用 c的計數為2
? ? d = null;// d不再引用c c的計數減為1
? ? e = {};// e不再引用c c的計數減為0 將被回收
}
注意:循環引用需要手動清除
function fn2(){
? ? ? let a = {};
? ? ? let b = {};
? ? ? a.grop = b;
? ? ? b.group = a;
? ? ? //a 和 b的互相引用,導致計數不能為0。
}
fn2();
a.grop = null; b.group = null;
手動設置。
內存泄露:
1.全局變量照成內存泄露。
2.未銷毀的定時器和回調函數。
3.閉包
4.DOM引用