先來看一個(gè)閉包的例子:
function assignHandler () {
var element = document.getElementById("someElement");
element.onclick = function () {
alert(element.id);
}
}
根據(jù)瀏覽器垃圾回收機(jī)制中的引用計(jì)數(shù)策略可知,這里的引用類型 someElement 被賦值給了變量 element,而 element 變量又被事件處理函數(shù)引用,dom 對象的引用計(jì)數(shù)是 2,這樣就形成了循環(huán)引用,當(dāng)事件處理函數(shù)被多次調(diào)用時(shí),就會(huì)導(dǎo)致大量內(nèi)存無法被回收。
引用計(jì)數(shù)的含義是,跟蹤記錄每個(gè)值被引用的次數(shù)。當(dāng)聲明一個(gè)變量并將一個(gè)引用類型的值賦給該變量時(shí),這個(gè)值的引用次數(shù)就是1,如果這個(gè)值再被賦值給另一個(gè)變量,則引用次數(shù)加1。相反,如果一個(gè)變量脫離了該值的引用,則該值引用次數(shù)減1,當(dāng)次數(shù)為0時(shí),就會(huì)等待垃圾收集器的回收。
在前端性能優(yōu)化中,我們通常將不再需要的變量置空,讓瀏覽器垃圾回收機(jī)制回收,避免占內(nèi)存。這里也可以通過將變量設(shè)置為 null,來清除循環(huán)引用。
window.onload = function () {
var element = document.getElementById("someElement");
var id = element .id;
element .onclick = function () {
alert(id);
}
element = null;
}
.
【1】《JavaScript高級程序設(shè)計(jì)》
p80
p184