移动或附加该元素时对元素的引用是否会中断?

时间:2013-07-15 05:15:37

标签: javascript dom

我是JS的新手,但仍不太确定DOM是如何工作的。我有一些尖锐的问题。

如果我有一个DOM元素的引用,比如......

var element = document.createElement("DIV");

当我......

时,该参考是否有效
foo.appendChild(element);

或者...

foo.insertBefore(element, bar);

最后,当我将DOM节点指向变量时,究竟存储了什么?幕后还有其他神奇的ID吗?感谢。

1 个答案:

答案 0 :(得分:3)

当您在JavaScript中引用任何时,只要您拥有该引用,该引用仍然有效。这包括DOM对象以及普通的JavaScript对象。

考虑这个非DOM示例来获得这个想法:

var objects = {
    one: { foo: 'bar' },
    two: { hoo: 'har' }
};

var won = objects.one;
console.log( 'objects:', objects );
console.log( 'won:', won );
delete objects.one;
console.log( 'objects:', objects );
console.log( 'won:', won );

如果将其粘贴到JavaScript控制台,它将记录:

objects: Object {one: Object, two: Object}
won: Object {foo: "bar"}
objects: Object {two: Object}
won: Object {foo: "bar"}

如您所见,从one删除objects属性不会影响won变量中存储的其他参考。

DOM元素也是如此。当您创建一个DOM元素并保持对它的引用时,该引用及其引用的对象 - 除非您释放引用并且没有其他未完成的引用,否则它将消失。例如,此函数创建一个DOM元素,但不保留对它的任何引用:

function silly() {
    var foo = document.createElement('div');
}

silly();

这里我们创建一个DOM元素,并在foo变量中引用它。但随后函数返回,它会销毁该变量并释放其对DOM元素的引用。该元素现在可以随时被垃圾收集。

这与你的例子有所不同,你的实际上保留了一个变量来保存引用。

这是如何在幕后工作的?嗯,这取决于特定的JavaScript引擎。大多数JavaScript引擎都是用C或C ++编写的,并使用指针与垃圾收集或类似技术相结合。当你引用DOM元素时,通常不会有某种神奇的ID查找来查找DOM元素。它更像是C中的直接指针引用。一件事直接指向另一件事,与变量"指向"的方式非常相似。 (包含对JavaScript中对象的引用)。

当然,正如@Mics指出的那样(双关语意图),确切的细节依赖于实现。只要JavaScript代码的行为符合规定,就可以成为神奇的ID查找,或几乎任何东西。