【问题标题】:Javascript: document.createElement('') & delete DOMElementJavascript:document.createElement('') & 删除 DOMElement
【发布时间】:2010-12-23 06:20:30
【问题描述】:

如果您在如下函数中创建元素:

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
}

并且您没有将它附加到 DOM 中的任何位置,即通过 .appendChild 函数,它是否仍保留在内存中?所以你必须这样做吗

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
   delete createdElement;
}

我只是好奇:)

【问题讨论】:

  • 它应该与函数范围内的任何其他变量一起清理。
  • @Rob - 这应该是一个答案:)

标签: javascript html createelement


【解决方案1】:

它会因浏览器而异,但是 javascript delete 关键字与 DOM 的 createElement 方法无关。不用delete

将会发生的情况是,对当前保存在createdElement 中的元素的引用将被垃圾回收。现在在 IE 的情况下,这意味着该元素的引用计数将下降到 0,因此它将自行销毁并释放其内存。其他浏览器做事不同,通常 DOM 中的元素本身就是垃圾收集对象,将在同一个(或者可能是特定于 DOM 的)GC 周期中被删除。

如果元素被添加到文档中,那么在 IE 的情况下,将向元素添加另一个引用,因此当 createdElement 中的引用被删除时,元素对象仍将具有非零引用计数并继续存在。

在元素本身被垃圾收集的其他浏览器的情况下,不会收集元素,因为收集器会在连接到文档的对象图中看到它。

【讨论】:

  • 另外,如果函数语句出现在 createElement 之后,指的是创建的元素,它将在元素周围创建一个闭包。然后元素的垃圾收集将依赖于被垃圾收集的函数本身,无论是否插入document
  • @Cresent:在形成闭包之前,对函数的引用必须放在当前执行上下文之外的某个地方。然而,函数甚至不必引用包含元素的变量来存在循环引用,变量和函数都存在于相同的执行上下文中这一事实足以做到这一点。
  • 如果有人这样做:function makeDomElement() { var DOMifier = document.createElement('div'); DOMifier.innerHTML = "
    ";监听器是否会附加并将其保存在内存中。我有一个方法可以接收任何字符串(可能包含 html)并使用内置的 DOM 解析器来识别文本节点。但是,我不需要保留已解析的 DOM 对象。恐怕如果任何字符串都可以将自己附加回 DOM,那么我就会有泄漏。
  • 内存自动垃圾回收?
【解决方案2】:

函数终止后,不再有对该对象的任何引用,即如果垃圾收集器正常工作,它应该被收集(如果涉及到 DOM 节点,有一个 IE 错误会阻止收集具有循环引用的对象)。

此外,由于无法删除局部变量,您的代码已损坏:尝试这样做甚至会在严格模式 ES5 中引发语法错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2016-10-24
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多