码迷,mamicode.com
首页 > 其他好文 > 详细

闭包会造成内存泄漏吗?

时间:2017-09-24 23:41:48      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:活动   不同   script   null   and   blog   垃圾收集   情况   click   

闭包会造成内存泄漏吗? 不会!!!

发现网上一堆闭包的教程都说闭包会造成内存泄漏,特意去查了下书,发现这一直是一个误解。

js高程原文这样说的:由于IE9 之前的版本对JScript 对象和COM 对象使用不同的垃圾收集。因此闭包在IE 的这些版本中会导致一些特殊的问题。具体来说,如果闭包的作用域链中保存着一个HTML 元素,那么就意味着该元素将无法被销毁。

意思就是闭包造成的内存泄漏是旧版本IE的bug,真正情况下的闭包不会造成内存泄漏。

下面是修复旧版本IE内存泄漏的方法:

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

以上代码创建了一个作为element 元素事件处理程序的闭包,而这个闭包则又创建了一个循环引用。由于匿名函数保存了一个对assignHandler()的活动对象的引用,因此就会导致无法减少element 的引用数。只要匿名函数存在,element 的引用数至少也是1,因此它所占用的内存就永远不会被回收,这是IE的问题,所以闭包和内存泄漏没半毛钱关系。

解决办法前言已经提到过,把element.id 的一个副本保存在一个变量中,从而消除闭包中该变量的循环引用同时将element变量设为null。

function assignHandler(){
    var element = document.getElementById("someElement");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    };
    element = null;
}

总结:闭包并不会引起内存泄漏,只是由于IE9 之前的版本对JScript对象和COM对象使用不同的垃圾收集,从而导致内存无法进行回收。

闭包会造成内存泄漏吗?

标签:活动   不同   script   null   and   blog   垃圾收集   情况   click   

原文地址:http://www.cnblogs.com/guorange/p/7588930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!