请问为什么会内存泄漏?<script> 
document.onclick=function(){};  
document.getElementById("a").doc=document;
</script>

解决方案 »

  1.   

    整个html:
    <html> 
    <body>
    <div id="a"></div>
    </body>
    <script> 
    document.c=new Array();
    document.getElementById("a").doc=document;
    </script>
    </html>确实是泄漏了,使用工具IE leaks detector看的。document无法被回收的。高手帮忙~
      

  2.   

    我以为是onclick事件绑定的问题,但是使用了上面的代码进行尝试,仍然是泄漏的。
      

  3.   

    document.getElementById("a").doc=document; 
    应该是这句吧...
      

  4.   

    document.getElementById("a").doc=document;
    document被引用后没有没有被浏览器回收
      

  5.   

    dom上挂载dom应该是可以回收的。这两句只要去掉一句就不会有泄漏。
    document.c=new Array();
    document.getElementById("a").doc=document; 而这两句又看似不相干的。这正是疑惑所在啊。高手帮忙~
      

  6.   

    var dddd=document.getElementById("a");
    dddd.doc=document;
    产生闭包了,所以就内存泄露了.闭包还不是很清晰,这样是我的结论.
      

  7.   

    无限重复生成document自定义属性c
      

  8.   

    To archko:
    var dddd=document.getElementById("a");
    dddd.doc=document; 
    不会产生闭包吧?
    另外:删除了document.c=new Array();泄漏就会消失的。-----------To:natineprince能否详细的说明一下,为何无限重复生成了C?又:无限重复生成==内存溢出? 
      

  9.   

    虽然上面那代码我用Drip-0.5.exe测试过也没看到LEAK.
    不知道你那个泄露器怎么分析的
    但如果按这思路
    document.c=new Array(); //document.c成为新的Array对象
    document.getElementById("a").doc=document; //document中的ID为a的HTML对象中增加自定义属性.他是document,然后重新解释document.重新定义document中的c.再重新将document中的a增加自定义属性.
    倒是有点可能内泄.
      

  10.   

    js里对象的赋值是引用,难道引用也会引起 “重新解释document.重新定义document中的c”? 
    另外做了如下尝试,不会泄漏:
    a.doc=document; 
    document.c="123";//改为 document.c=new String("123") 则泄漏高手指点~----------------------------------------
    下面一个典型的leak用drip也看不到的。
    <div id="outerDiv"><div id="innerDiv">111111111111</div></div>  
      <script type="text/javascript">  
    function leak(){
       var i=document.getElementById('innerDiv');
       var b=function(){};
       i.kk=b;
       i.parentNode.removeChild(i); 
      }
     leak();  
    </script>  
      

  11.   

    "These memory leaks often occur as a result of circular references between JavaScript objects and objects within IE’s DOM (document object model)." GPDE Team Blog<script>
    document.onclick=function(){}; //dom reference the javascript object
    document.getElementById("a").doc=document; //dom reference dom
    </script>按照GPDE TEAM的说法,上面两句应该不会造成泄漏。
      

  12.   

    是啊,我也认为不会产生泄漏,事实上确实泄漏了。JScript leaker detector 测试结果。
      

  13.   

    和winter讨论了一下,document.onclick=function(){}这句确实产生了循环引用!请参见:如何避免Javascript事件绑定出现内存泄漏  http://www.w3cgroup.com/article.asp?id=207
      

  14.   

    下面代码也会产生内存泄漏(无事件绑定):
    <div id="a"></div>
    <script>
       document.e={};
       a.c=document;
    </jscript>依dh20156 ,隐藏了循环引用的实际伪代码?
    <div id="a"></div>
    <script>
       document.e=scopechain.{};
       scopechain.(a).c=document;
    </jscript>产生了循环引用
      

  15.   

    风之石版主有没有计划写一篇关于此问题的blog,期待详细论述。
      

  16.   


    其实理解了JavaScript的作用域及作用域链,再来分析对象间的循环引用就很清晰了,至于写总结,暂时还没有计划,看情形吧,如果确实有需要的话,可以整理一份文档。
      

  17.   

    难道真的“有时候”漏 有时候不漏?
    下面代码不漏:
    <div id="a" >1</div> 
    <div id="b">2</div>
    </body>
    <script for="" e> 
    a.d=b; 
    b.c={};
    </script>document有特别之处?
      

  18.   

    典型的“循环引用”。脚本引擎对象会维持对DOM对象的引用,并在清理和释放DOM对象指针前等待所有引用的移除。解决办法:在页面关闭前document.getElementById("a").doc = null;取消document的引用。
      

  19.   

    以下也是循环引用,但不会泄漏,有什么原理可以解释?<script> 
    document.body.onclick=function(){};  
    document.getElementById("a").doc=document.body; 
    </script>
      

  20.   

    ie中对采用的垃圾回收机制是标记清除,但是对dom,bom采用的是引用计数