销毁闭包

先来看一个闭包的例子:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。