function bindEvent()
{
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}
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元素节点的时候,需要先将其关联的手机事件监听函数解除关联(如果有的话)
以上描述有误,请忽略~~~
经 @小_秦 指正,修正了我的一些错误理解~~,关于闭包形成的作用域整理如下
闭包的形成在函数声明时
在一个函数内声明一个函数时,要形成一个闭包必须要在函数中引用/使用其外层函数的变量,而不是一个函数声明时天然就会引用外层函数的作用域-即使没有使用到
所以一个空函数是不会形成闭包的,那么也就不存在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属性引用。相互引用而不能释放内存~~~~
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
不是因为闭包,是因为重复创建了元素和重复绑定了事件。