javascript - 下面这个函数内存泄露的原因是什么?是因为闭包?
PHPz
PHPz 2017-04-10 16:40:00
[JavaScript讨论组]
function bindEvent() 
{ 
    var obj=document.createElement("XXX"); 
    obj.onclick=function(){ 
        //Even if it's a empty function 
    } 
}
PHPz
PHPz

学习是最好的投资!

全部回复(2)
天蓬老师

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

怪我咯

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

    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属性引用。相互引用而不能释放内存~~~~

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号