72

如果您在函数中创建一个元素,例如:

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

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

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

我只是好奇 :)

4

2 回答 2

60

它会因浏览器而异,但是 javascript关键字与 DOM 的方法delete无关。createElement没有必要使用delete.

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

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

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

于 2009-12-04T14:28:54.443 回答
15

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

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

于 2009-12-04T14:32:07.590 回答