1

我在一个仅临时需要的函数中动态添加一个“div”节点。我已经使用 < parent >.removeChild 将其分离,然后将其设置为 null,但我很想知道在函数中创建的未附加节点超出范围时会发生什么情况?

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

  • A)设置为 null 甚至是必要的还是在返回时会自动消失?
    • 如果是这样,设置为 null 是否正确?
  • B) 是否需要对其属性进行任何处理?(如node.style.position)
  • C)如果它包含额外的子节点,它们是否需要单独处理,或者当它们的未附加父节点设置为空时它们会消失?
  • 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;
    }
4

2 回答 2

2

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

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

我应该注意,一些较旧的浏览器具有垃圾收集器的引用计数实现,如果你有循环(一个指向其他东西的元素又指向该元素,这通常发生在事件侦听器中),它们可能不会被收集,你' d 必须明确打破引用,但今天的大多数浏览器都更智能。

于 2013-10-03T01:43:37.090 回答
1

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

于 2013-10-03T01:43:08.350 回答