二、闭包(Closures)
仍然先看一段代码:
< 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框架都帮我们解决了这个问题,不需要我们自己处理,这也是使用框架的一个好处。
出处:alibaba.com中国站
责任编辑:bluehearts
上一页 GC与JS内存泄露 [3] 下一页 GC与JS内存泄露 [5]
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|