我是 JS 新手,仍然不太确定 DOM 是如何工作的。我有几个尖锐的问题。
如果我有对 DOM 元素的引用,例如...
var element = document.createElement("DIV");
当我...时,该参考是否仍然有效?
foo.appendChild(element);
或者...
foo.insertBefore(element, bar);
最后,当我将 DOM 节点指向变量时,究竟存储了什么?幕后有魔法ID,还是别的什么?谢谢。
我是 JS 新手,仍然不太确定 DOM 是如何工作的。我有几个尖锐的问题。
如果我有对 DOM 元素的引用,例如...
var element = document.createElement("DIV");
当我...时,该参考是否仍然有效?
foo.appendChild(element);
或者...
foo.insertBefore(element, bar);
最后,当我将 DOM 节点指向变量时,究竟存储了什么?幕后有魔法ID,还是别的什么?谢谢。
当您引用 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 查找来查找它。它更像是 C 中的直接指针引用。一件事直接指向另一件事,其方式与 JavaScript 中变量“指向”(持有对)对象的方式非常相似。
当然,正如@Mics 指出的那样(双关语),确切的细节取决于实现。只要 JavaScript 代码的行为是指定的,它就可以是一个神奇的 ID 查找,或者任何东西。