如何完全删除临时元素

How to fully remove temporary elements?

本文关键字:元素 删除 何完全      更新时间:2023-09-26

我正在一个函数中动态添加一个"div"节点,该节点只是暂时需要的。 我已经使用<父>.removeChild 将其分离,然后将其设置为 null,但我很好奇当函数超出范围时,在函数中创建的未附加节点会发生什么?

如果节点保留在内存中但未连接:

  • A) 是否甚至需要设置为 null 还是在返回时自动消失?
    • 如果是这样,设置为 null 是正确的方法吗?
  • B) 需要对其属性执行任何操作吗?(如node.style.position)
  • C) 如果它包含其他子节点,是否需要单独处理它们,或者当它们的未附加父节点设置为 null 时它们会消失吗?
  • D) 可以使用哪些工具来查看这些类型的未附加资源?

下面是一个用于讨论目的的示例函数:

    function dpi(){
      var res={},
        div=document.createElement("div"),
        body=document.getElementsByTagName('body')[0];
      div.style.position="absolute";
      div.style.width="1in";
      div.style.height="1in";
      div.style.left="-100%";
      div.style.top="-100%";
      body.appendChild(div);
      res["xdpi"]=div.offsetWidth;
      res["ydpi"]=div.offsetHeight;
      body.removeChild(div);
      div=null;
      return res;
    }
JavaScript使用

自动内存管理。也就是说,它使用垃圾回收器,其中未引用的任何内容都将自动释放。要回答您的具体问题:

  1. 不,没有必要将其显式设置为 null - 当您返回时它会消失。
  2. 不;这些应该自动处理。
  3. 不,孩子也应该自动照顾。
  4. 也许是某种垃圾收集器调试器。

我应该注意,一些较旧的浏览器具有垃圾收集器的引用计数实现,如果您有循环(指向指向该元素的其他内容的元素,这通常发生在事件侦听器中),它们可能不会被收集,您必须显式中断引用,但今天的大多数浏览器都更聪明。

垃圾回收器在运行时会寻找任何未连接到其他内容的内容(粗略地说 - 它有一些特殊的东西来处理未连接到其他事物的循环引用)。基本上,如果没有更多指向该元素的变量,它将在浏览器方便时从内存中删除。现在,这可能是即时的,也可能是浏览器任意决定它使用了太多内存并决定清理一点时。我不相信有任何关于浏览器应该如何垃圾收集的规范。