不理解闭包和事件绑定内存泄露问题,有代码,右图,欢迎进来

HPhone 2011-12-21 12:04:02
[b]我不明白他的那个图到底是什么意思?怎么搞的作用域循环引用/b]

如果看不清图片的话,网页源地址:http://www.update8.com/Web/Javascript/11137_4.html
< html > 
< head >
< script language = “ JScript “ > function AttachEvents(element)
{
// This structure causes element to ref ClickEventHandler
element.attachEvent( “ onclick “ , ClickEventHandler); function ClickEventHandler()
{
// This closure refs element
}
} function SetupLeak()
{
// The leak happens all at once
AttachEvents(document.getElementById( “ LeakedDiv “ ));
} </ script >
</ head > < body onload = “ SetupLeak() “ >
< div id = “ LeakedDiv “ ></ div >
</ body >
</ html >

闭包的一个内部方法赋给了element对象,产生了一个作用域的循环引用,从而造成内存泄露。其原理图如下:

解决方案如下,在确定事件不再使用后,解除事件的绑定:



function BreakLeak() { document.getElementById(”LeakedDiv”).detachEvent(”onclick”, document.getElementById(”LeakedDiv”).expandoClick); document.getElementById(”LeakedDiv”).expandoClick = null; }

通常情况下,常用的js框架都帮我们解决了这个问题,不需要我们自己处理,这也是使用框架的一个好处。
...全文
155 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
南老頭 2011-12-21
  • 打赏
  • 举报
回复
木看到图片
峭沙 2011-12-21
  • 打赏
  • 举报
回复
这张图应该是说函数AttachEvents包含一个dom的引用——document.getElementById( “ LeakedDiv “ ),而document.getElementById( “ LeakedDiv “ )这个dom元素又同时保持有AttachEvents函数的子函数ClickEventHandler的引用,这样就构成js对象(函数对象)和Native Object(dom对象)的循环引用,这种问题IE6处理不了,会造成内存泄露。
个人理解,仅供参考
峭沙 2011-12-21
  • 打赏
  • 举报
回复
这张图应该是说函数AttachEvents——document.getElementById( “ LeakedDiv “ ),而document.getElementById( “ LeakedDiv “ )这个dom元素又同时保持有AttachEvents函数的子函数ClickEventHandler的引用,这样就构成js对象(函数对象)和Native Object(dom对象)的循环引用,这种问题IE6处理不了,会造成内存泄露。
个人理解,仅供参考
HPhone 2011-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zjleon2008 的回复:]

我觉得你不需要去理解他这个"泄漏",因为一般来说闭包都不是这么用的
虽然我不是很懂,不过感觉这个溢出是和函数的构造顺序有关,感觉闭包中的函数被构建了两次的样子
[/Quote]
我感觉还是理解比较好,这样有利于以后的学习
zjleon2008 2011-12-21
  • 打赏
  • 举报
回复
我觉得你不需要去理解他这个"泄漏",因为一般来说闭包都不是这么用的
虽然我不是很懂,不过感觉这个溢出是和函数的构造顺序有关,感觉闭包中的函数被构建了两次的样子
HPhone 2011-12-21
  • 打赏
  • 举报
回复
图片上面有地址,可以看一下

87,916

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧