Javascript 何时对本地未连接的DOM元素进行垃圾收集?
Javascript中的对象在失去作用域且不再被引用时会被垃圾回收。但是,何时不再引用元素?采取以下措施:Javascript 何时对本地未连接的DOM元素进行垃圾收集?,javascript,dom,garbage-collection,Javascript,Dom,Garbage Collection,Javascript中的对象在失去作用域且不再被引用时会被垃圾回收。但是,何时不再引用元素?采取以下措施: var el=(函数(){ //生成DOM元素,但不要将其附加到DOM var div=document.createElement('div'); //提供内部内容 div.innerHTML='AB'; //获取对div中第一个子元素的引用 var结果=div.firstChild; //吹走所有div内容 div.innerHTML=''; //返回原始的第一个子元素 返回结果; }
var el=(函数(){
//生成DOM元素,但不要将其附加到DOM
var div=document.createElement('div');
//提供内部内容
div.innerHTML='AB';
//获取对div中第一个子元素的引用
var结果=div.firstChild;
//吹走所有div内容
div.innerHTML='';
//返回原始的第一个子元素
返回结果;
})();
我的问题有两个:
div.innerHTML=''中的内容代码>分配还会删除对其中任何子节点的引用,还是在垃圾收集过程的内存前检索过程中删除
div
已附加到DOM,而不是函数退出时超出范围的局部变量,这会有什么区别吗div
对它们的引用,是的。当然,如果其他东西(如结果
变量)对它们有引用,则该引用将保留。这发生在作业完成时,而不是以后
通过查看您在result
中获得的span
上的parentNode
,可以判断何时清除div
及其子级(双向)之间的引用。在div.innerHTML=''之前代码>行,它将是对div
的引用;之后,它将是null
:
var el=(函数(){
//生成DOM元素,但不要将其附加到DOM
var div=document.createElement('div');
//提供内部内容
div.innerHTML='AB';
//获取对div中第一个子元素的引用
var结果=div.firstChild;
log(“清除div之前的result.parentNode:+result.parentNode”);
//吹走所有div内容
div.innerHTML='';
log(“清除div后的result.parentNode:+result.parentNode”);
//返回原始的第一个子元素
返回结果;
})();代码>
是否删除div.innerHTML=''中的内容;赋值还将删除对其中任何子节点的引用
它会删除div
对它们的引用,是的。当然,如果其他东西(如结果
变量)对它们有引用,则该引用将保留。这发生在作业完成时,而不是以后
通过查看您在result
中获得的span
上的parentNode
,可以判断何时清除div
及其子级(双向)之间的引用。在div.innerHTML=''之前代码>行,它将是对div
的引用;之后,它将是null
:
var el=(函数(){
//生成DOM元素,但不要将其附加到DOM
var div=document.createElement('div');
//提供内部内容
div.innerHTML='AB';
//获取对div中第一个子元素的引用
var结果=div.firstChild;
log(“清除div之前的result.parentNode:+result.parentNode”);
//吹走所有div内容
div.innerHTML='';
log(“清除div后的result.parentNode:+result.parentNode”);
//返回原始的第一个子元素
返回结果;
})();代码>非常彻底的回答@T.J.Crowder。谢谢非常彻底的回答@T.J.Crowder。谢谢
var el = (function() {
// Generate DOM element, but don't attach it to DOM
var div = document.createElement('div');
// Provide interior content
div.innerHTML = '<span>A</span><span>B</span>';
// Get reference to first child element in div
var result = div.firstChild;
// Blow away all div content
div.innerHTML = '';
// Return original first child element
return result;
})();