关于闭包在IE9及之前浏览器的内存泄漏问题

在IE9之前的版本的中,如果闭包的作用域链中保存着对HTML元素的引用,那么就意味着该元素无法被销毁。


function assHandler() {
    var element = document.getElementById("myElement");
    element.onclick = function () {
        alert(element.id);
    };
}


如上述代码,创建了一个element元素事件处理程序的闭包,而这个闭包以创建了一个对element元素的循环引用。由于闭包会引用外部函数的整个活动对象。因此该闭包中也就保存了对assHandlder()函数的活动对象element对象的引用,因此无法减少对element的引用次数。只要这个闭包一直存在(因为要弹出"element.id"),所以免不了对element元素的引用,而"element.id"又在闭包函数中,就会对该元素形成循环引用。只要这个闭包一直存在,对element元素的引用至少是1次,因此它所占的内存就永远无法被回收。

解决这个问题的方法:将对element元素的引用赋值给一个变量,并且在闭包中引用这个变量,对消除了对element元素的循环引用,同时,将对element的引用赋值null,这样就回收了其占用的内存。

function assHandler() {
    var element = document.getElementById("myElement");
    var id = element.id; //将对element的引用赋值给一个变量

    element.onclick = function () {
        alert(id); //闭包中,对这个变量引用。
    };

    element = null; //对element的引用赋值null,这样,解除了对DOM对象的引用,顺利减少引用次数,回收内存。
}


将对element元素的引用赋值给一个变量,这样就能消除对该元素的循环引用,因为闭包中只对这个变量引用。由于闭包会引用外部函数的所有活动对象,即使闭包不直接引用element,外部函数中也会保存一个对element元素的引用。此时,将element变量赋值null,这样就能解除对DOM对象的引用,顺利减少引用次数,回收其占用的内存。



总结,要想避免在IE9之前的内存泄漏问题,解决方法有两点:
1、将对HTML元素的引用赋值给一个变量,变样能消除对该元素的循环引用。

2、由于闭包会引用外部函数的整个活动对象,即使闭包不直接引用某HTML元素,但外部函数中依然会保存一个对该元素的引用(因为有通过ID、类名等获取该元素的操作),所以将这个变量赋值null,就解除了对DOM对象的引用,回收其占用的内存。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值