首页 > 下面这个函数内存泄露的原因是什么?是因为闭包?

下面这个函数内存泄露的原因是什么?是因为闭包?

function bindEvent() 
{ 
    var obj=document.createElement("XXX"); 
    obj.onclick=function(){ 
        //Even if it's a empty function 
    } 
}

闭包的关系,即使是空函数~~~

    var obj=document.createElement("XXX"); 
    obj.onclick=function(){ 
        //Even if it's a empty function 
    }  
} ``` 
会引起内存泄露是因为你的bindEvent中创建的变量obj的引用计数不会变成0,不能被JS垃圾回收掉。 当去GC >obj的是否发现有个匿名函数对象和它由关联,去GC 匿名函数的时候发现obj和它由关系。 相互引用而不能释放。

一个空函数也会有闭包,一个闭包作用域形成后就会一个用其外层函数的局部变量-即使这个变量在当前的函数中没有使用到~~

所以当我们remove一个DOM元素节点的时候,需要先将其关联的手机事件监听函数解除关联(如果有的话)

以上描述有误,请忽略~~~


经 @小_秦 指正,修正了我的一些错误理解~~,关于闭包形成的作用域整理如下

  1. 闭包的形成在函数声明时

  2. 在一个函数内声明一个函数时,要形成一个闭包必须要在函数中引用/使用其外层函数的变量,而不是一个函数声明时天然就会引用外层函数的作用域-即使没有使用到

所以一个空函数是不会形成闭包的,那么也就不存在GC时相互引用的问题
题目的问题是由于IE浏览器的bug造成的,和闭包无关-因为没有闭包

function bindEvent() 
{
    var obj=document.createElement("XXX"); 
    obj.onclick=function(){ 
        //Even if it's a empty function 
    } 
}

bindEvent函数执行完后,obj变量将会从执行栈中清除,其对应的对象也符合GC条件-没有其它变量对齐有引用
o'clock对应的匿名函数不构成闭包-没有任何对外层便变量的引用

如果代码修改成如下,就会有内存泄露的问题

function bindEvent() 
{
    var obj=document.createElement("XXX"); 
    obj.onclick=function(){ 
        console.log(obj);
    } 
}

o'click匿名函数构成闭包,其作用域将应用全局对象及外层函数的obj变量指向的对象,在GC obj对应的对象时,匿名函数引用了它,而GC匿名函数对象时发现自己又被obj对象的onclick属性引用。相互引用而不能释放内存~~~~


敢问你所说的上面的代码会产生内存泄露的依据是什么?


不是因为闭包,是因为重复创建了元素和重复绑定了事件。

【热门文章】
【热门文章】