如何完全删除临时元素?

时间:2013-10-03 01:40:29

标签: javascript performance

我正在动态添加一个' 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;
    }

2 个答案:

答案 0 :(得分:2)

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

  1. 不,没有必要明确地将其设置为null - 当你返回时它会消失。
  2. 否;那些应该自动处理。
  3. 否;孩子也应该自动照顾。
  4. 也许是某种垃圾收集器调试器。
  5. 我应该注意,一些旧的浏览器具有垃圾收集器的引用计数实现,如果你有循环(一个指向其他指向元素的元素,通常发生在事件监听器中),它们可能不会被收集并且你必须明确地打破引用,但今天的大多数浏览器都更聪明。

答案 1 :(得分:1)

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