Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 此解决方案处理DOM内存泄漏是否正确_Javascript_Dom_Memory Management - Fatal编程技术网

Javascript 此解决方案处理DOM内存泄漏是否正确

Javascript 此解决方案处理DOM内存泄漏是否正确,javascript,dom,memory-management,Javascript,Dom,Memory Management,全部: 当我尝试学习JSDOM内存泄漏教程时,有一个关于旧IE的内存泄漏示例(7,8): 点击我 var btn=document.getElementById(“myBtn”); btn.onclick=函数(){ document.getElementById(“myDiv”).innerHTML=“处理…”; } 它给出的解决方案是: <div id="myDiv"> <button id="myBtn">Click Me</button>

全部:

当我尝试学习JSDOM内存泄漏教程时,有一个关于旧IE的内存泄漏示例(7,8):


点击我
var btn=document.getElementById(“myBtn”);
btn.onclick=函数(){
document.getElementById(“myDiv”).innerHTML=“处理…”;
}
它给出的解决方案是:

<div id="myDiv">
    <button id="myBtn">Click Me</button>
</div>

<script type="text/javascript">
    var btn = document.getElementById("myBtn");
    btn.onclick = function(){




        btn.onclick = null;





        document.getElementById("myDiv").innerHTML = "Processing...";
    }
</script>

点击我
var btn=document.getElementById(“myBtn”);
btn.onclick=函数(){
btn.onclick=null;
document.getElementById(“myDiv”).innerHTML=“处理…”;
}
我的问题是:

  • 漏洞是什么:myBtn DOM对象还是onclick函数?(我的理解是:它试图说DOM,因为innerHTML试图用文本节点替换整个按钮节点)
  • 如果DOM是泄漏,那么
    btn
    变量仍然引用DOM,这导致它无法GCed,为什么这可以成为解决方案

  • 谢谢

    两种情况下都有泄漏。您必须释放指向DOM对象的
    btn
    变量和
    onclick
    事件以停止侦听该事件。

    这两种情况下都存在泄漏。您必须释放指向DOM对象的
    btn
    变量和
    onclick
    事件以停止侦听该事件。

    @ibrahimmahrir感谢您的回复。我想我有点糊涂了。我想问的是为什么这个解决方案有效,而不是为什么这是一个记忆leak@ibrahimmahrir在这个具体的例子中,你能稍微说说是什么导致了循环引用吗?我真的很难理解为什么这是一个循环refkuan实际上我认为我对循环引用是错误的。在这个例子中似乎没有你的另一个问题中的例子。@ibrahimmahrir谢谢你澄清我的想法。“这种内存泄漏让我很难受。”易卜拉欣·赫里尔:谢谢你的回复。我想我有点糊涂了。我想问的是为什么这个解决方案有效,而不是为什么这是一个记忆leak@ibrahimmahrir在这个具体的例子中,你能稍微说说是什么导致了循环引用吗?我真的很难理解为什么这是一个循环refkuan实际上我认为我对循环引用是错误的。在这个例子中似乎没有你的另一个问题中的例子。@ibrahimmahrir谢谢你澄清我的想法。这个内存泄漏的东西让我很难受。谢谢,这也是我的想法,谢谢你的澄清。这让我感到困惑,因为在我读到的文章中,第二部分代码标记为解决方案。谢谢,这也是我的想法,谢谢你的清晰。这让我感到困惑,因为在我读到的文章中,第二部分代码标记为解决方案。
    <div id="myDiv">
        <button id="myBtn">Click Me</button>
    </div>
    
    <script type="text/javascript">
        var btn = document.getElementById("myBtn");
        btn.onclick = function(){
    
    
    
    
            btn.onclick = null;
    
    
    
    
    
            document.getElementById("myDiv").innerHTML = "Processing...";
        }
    </script>