11
回答
为什么第一段代码可能会出现内存泄露。
华为云4核8G,高性能云服务器,免费试用   

我知道是Closure造成的问题。但是具体是怎么出现的谁来解释下。。。

举报
robinclark
发帖于3年前 11回/999阅
共有11个答案 最后回答: 3年前

对于第一种,由于闭包会引用button,造成循环引用。对于IE8以下浏览器就会造成泄漏。

--- 共有 3 条评论 ---
雪梨苹果能解释下循环引用吗?我看到在一个闭包内定义一次,看不出哪里循环引用。 3年前 回复
robinclark有道理呢。能具体解释下吗??? 3年前 回复
sxgkwei没懂你说什么。。。 3年前 回复

应该是第一个方式里面,首先有一个DOM元素对象button,然后人为定义button的属性onclick是一个闭包函数,在JS里面,闭包函数是可以访问外层函数的变量,也就是onclick的闭包函数里面引用到了button元素,即使你没有使用这个东西,这就循环引用了。

逻辑上来说就是:如果要释放button对象,需要先删除onclick函数,可是删除onclick函数就需要先释放对button对象的引用,然后要释放button的引用又需要先删除onclick函数,就这样死循环下去,内存泄漏了

--- 共有 1 条评论 ---
robinclark挺有道理的。。。 3年前 回复

ie中闭包函数是会引起内存泄露的。

function(){
    var a = document.getElementById('div_name');
    a.onclick = function(){}//匿名函数会引用a,a通过onclick引用匿名函数
}




顶部