先来看一个闭包的例子:
function assignHandler () {
var element = document.getElementById("someElement");
element.onclick = function () {
alert(element.id);
}
}
根据浏览器垃圾回收机制中的引用计数策略可知,这里的引用类型 someElement
被赋值给了变量 element
,而 element
变量又被事件处理函数引用,dom 对象的引用计数是 2,这样就形成了循环引用,当事件处理函数被多次调用时,就会导致大量内存无法被回收。
引用计数的含义是,跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型的值赋给该变量时,这个值的引用次数就是1,如果这个值再被赋值给另一个变量,则引用次数加1。相反,如果一个变量脱离了该值的引用,则该值引用次数减1,当次数为0时,就会等待垃圾收集器的回收。
在前端性能优化中,我们通常将不再需要的变量置空,让浏览器垃圾回收机制回收,避免占内存。这里也可以通过将变量设置为 null
,来清除循环引用。
window.onload = function () {
var element = document.getElementById("someElement");
var id = element .id;
element .onclick = function () {
alert(id);
}
element = null;
}
.
【1】《JavaScript高级程序设计》
p80
p184