闭包会形成内存泄漏吗?

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

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

js高程原文这样说的:因为IE9 以前的版本对JScript 对象和COM 对象使用不一样的垃圾收集。所以闭包在IE 的这些版本中会致使一些特殊的问题。具体来讲,若是闭包的做用域链中保存着一个HTML 元素,那么就意味着该元素将没法被销毁。html

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

下面是修复旧版本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对象使用不一样的垃圾收集,从而致使内存没法进行回收。学习

使用闭包的注意点spa

1)因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有删除。code

2)闭包会在父函数外部,改变父函数内部变量的值。因此,若是你把父函数看成对象(object)使用,把闭包看成它的公用方法(Public Method),把内部变量看成它的私有属性(private value),这时必定要当心,不要随便改变父函数内部变量的值。htm

参考:学习Javascript闭包(Closure)- 阮一峰

相关文章
相关标签/搜索