Javascript:document.createElement(';';)&;删除DomeElement

Javascript:document.createElement(';';)&;删除DomeElement,javascript,html,createelement,Javascript,Html,Createelement,如果在函数中创建元素,如: function makeDomElement() { var createdElement = document.createElement('textarea'); } 如果不将其附加到DOM中的任何位置,即通过appendChild函数,它是否仍保留在内存中?那你要怎么做 function makeDomElement() { var createdElement = document.createElement('textarea'); d

如果在函数中创建元素,如:

function makeDomElement()
{
   var createdElement = document.createElement('textarea');
}
如果不将其附加到DOM中的任何位置,即通过appendChild函数,它是否仍保留在内存中?那你要怎么做

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

我只是好奇:)

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

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

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


如果其他浏览器的元素本身是垃圾收集的,则不会收集该元素,因为收集器会在连接到文档的对象图中看到它。

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


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

应该用函数作用域中的任何其他变量清除。@Rob-这应该是一个答案:)此外,如果函数语句出现在引用所创建元素的
createElement
之后,它将在元素周围创建一个闭包。元素的垃圾收集将依赖于被垃圾收集的函数本身,无论是否插入
文档
@creent:在形成闭包之前,必须将对函数的引用放置在当前执行上下文之外的某个位置。然而,函数甚至不必引用包含循环引用的元素的变量,只要变量和函数都存在于同一执行上下文中就足够了;domiier.innerHTML=“;}将侦听器附加并保存在内存中。我有一个方法可以接收任何字符串(可能包含html),并使用内置的DOM解析器来识别文本节点。但是,我不需要保留已解析的DOM对象。我担心,如果任何字符串可以将其自身连接回DOM,那么我将有一个漏洞。内存自动垃圾收集?