Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 垃圾收集和文档片段_Javascript_Garbage Collection_Documentfragment - Fatal编程技术网

Javascript 垃圾收集和文档片段

Javascript 垃圾收集和文档片段,javascript,garbage-collection,documentfragment,Javascript,Garbage Collection,Documentfragment,我读过一篇关于内存泄漏的文章,其中垃圾收集器逻辑总结如下: 垃圾收集器构建一个“根”列表。根通常是 代码中保留引用的全局变量。在JavaScript中, “窗口”对象是全局变量的一个示例,可以作为 根。窗口对象始终存在,因此垃圾收集器 可以考虑它和它所有的孩子总是存在的(即不是) 垃圾) 检查所有根部,并将其标记为活动(即不活动 垃圾)。所有子项也会被递归检查。一切 可以从根目录访问的对象不被视为垃圾 所有未标记为活动的内存现在都可以被视为垃圾。收集器现在可以释放内存并将其返回操作系统。 此外,

我读过一篇关于内存泄漏的文章,其中垃圾收集器逻辑总结如下:

  • 垃圾收集器构建一个“根”列表。根通常是 代码中保留引用的全局变量。在JavaScript中, “窗口”对象是全局变量的一个示例,可以作为 根。窗口对象始终存在,因此垃圾收集器 可以考虑它和它所有的孩子总是存在的(即不是) 垃圾)
  • 检查所有根部,并将其标记为活动(即不活动 垃圾)。所有子项也会被递归检查。一切 可以从根目录访问的对象不被视为垃圾
  • 所有未标记为活动的内存现在都可以被视为垃圾。收集器现在可以释放内存并将其返回操作系统。
  • 此外,MDN声明DocumentFragment不是活动的DOM树的一部分

    DocumentFragment接口表示最小的文档对象 没有父母的孩子。它用作文档的轻量级版本 它存储文档结构的一段,该文档结构仅由节点组成 就像一份标准文件关键区别在于 文档片段不是活动文档树结构的一部分, 对片段所做的更改不会影响文档,会导致回流, 或在进行更改时可能产生的任何性能影响

    一点一点地,我开始意识到背后的逻辑,但如果有人能给我一些启示,我会非常感激:),使用下面的例子,并解释原因:

    1。在DOM引用被使用后,将其作废被认为是一种良好的做法。
    2.是否需要取消对DocumentFragment和包含它的元素的引用

    function usefulFunction(){
    让existingNode=document.querySelector(`.existingNode`)
    让createdNode=document.createElement(`ul`)
    让fragment=document.createDocumentFragment();
    让浏览器=['Firefox'、'Chrome'、'Opera',
    “Safari”、“Internet Explorer”];
    browsers.forEach(函数(浏览器){
    var li=document.createElement('li');
    li.textContent=浏览器;
    片段。附属物(li);
    });
    existingNode.appendChild(createdNode)
    createdNode.appendChild(片段)
    片段=空
    createdNode=null
    existingNode=null
    }
    usefulFunction()

    如果您正确使用了局部变量,那么在使用它们之后通常不需要将它们置零。当您离开函数的作用域时,变量就消失了,它们引用的任何对象如果不是来自某个仍在作用域中的变量的引用,就会变成垃圾。文档片段不是从DOM引用的,而是从变量引用的,因此当变量被销毁时,片段可以被垃圾收集

    这是您应该谨慎使用全局变量的原因之一。它们应仅用于需要随时间持续的数据,例如保存应用程序的状态

    请注意,在第一个示例代码中,将变量置零对垃圾收集没有影响,因为它们包含的所有节点和片段都附加到DOM中。但如果不是,那么这些对象在函数结束时就会变成垃圾,因此在返回之前不需要将变量置零


    在第二个代码段中,如果从DOM中删除该元素,则应该将existingNode置为null。否则,全局变量将阻止对节点进行垃圾收集。但是,如果希望节点在应用程序的整个生命周期内都是永久的,则无需担心变量。

    谢谢,Barmar为我做了一个很好的解释:)我已经做了补充,如果你能说这是你正在谈论的实际案例之一,如果我错了,你能纠正逻辑以显示有效的案例吗?或者你可以建议一篇好文章供晚上阅读吗谢谢,没什么区别。您仍然将创建的所有内容附加到DOM中,因此无法对其进行垃圾收集。变量是不相关的。我为没有正确表达我自己而道歉。在第二个代码段中,我最感兴趣的是existingNode变量本身(我只是重复使用了“旧”代码段),因为您解释了全局变量应该用于存储数据。所以,如果有人在某个时刻指定对DOM对象的引用,是否应该将其视为无效的有效案例?现在我明白了。我已经更新了答案来解决这个变化,见最后一段。