极客

销毁闭包

2019-03-07  本文已影响2人  极客传

先来看一个闭包的例子:

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

上一篇 下一篇

猜你喜欢

热点阅读