网络编程
位置:首页>> 网络编程>> JavaScript>> GC与JS内存泄露(4)

GC与JS内存泄露(4)

作者:alucard 来源:Alibaba.com UED 发布时间:2010-09-25 19:01:00 

标签:内存,js,javascript,IE

二、闭包(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框架都帮我们解决了这个问题,不需要我们自己处理,这也是使用框架的一个好处。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com