闭包会造成内存泄漏吗?

Posted Orange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包会造成内存泄漏吗?相关的知识,希望对你有一定的参考价值。

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

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

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对象使用不同的垃圾收集,从而导致内存无法进行回收。

以上是关于闭包会造成内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

闭包会造成内存泄漏吗?

闭包会造成内存泄漏吗?

前端开发中javascript闭包会引发内存泄漏么?

闭包为什么会造成内存泄漏?

闭包为什么会造成内存泄漏?

闭包为什么会造成内存泄漏?