Javascript 存储对DOM元素的引用

Javascript 存储对DOM元素的引用,javascript,dom,reference,Javascript,Dom,Reference,在我正在编写的特定脚本中,有许多对象链接到一些DOM元素。假设每个元素都有一个唯一的id,那么每个对象应该只保留元素的id(并且每次都使用document.getElementById),还是将元素存储在属性中 这里有一个简单的例子来说明我的意思: function myThing(elId) { this.elId = elId; } myThing.prototype.getElValue = function() { return document.getElementBy

在我正在编写的特定脚本中,有许多对象链接到一些DOM元素。假设每个元素都有一个唯一的id,那么每个对象应该只保留元素的id(并且每次都使用document.getElementById),还是将元素存储在属性中

这里有一个简单的例子来说明我的意思:

function myThing(elId) {
    this.elId = elId;
}
myThing.prototype.getElValue = function() {
    return document.getElementById(this.elId).nodeValue;
};

// -- vs -- //

function myThing(elId) {
    this.el = document.getElementById(elId);
}
mything.prototype.getElValue = function() {
    return this.el.nodeValue;
};

这有什么区别吗?有什么性能问题我应该知道吗?

存储元素而不是id,查找速度慢且成本高,可以节省函数调用。我想一个简单的测试就能证实这一点。

我会存储元素;当您不总是调用document.getElementById时,它会使代码更清晰,尽管在您的情况下,您可能不需要更改ID或允许没有ID的元素,但这样做是很常见的

(与apphacker不同,我不希望这样做会带来巨大的效率提升,因为getElementById在浏览器中的优化效果相当好。)

是否有任何性能问题需要我了解

从JavaScript对象到DOM对象的引用本身是很好的,但当DOM对象有一个指向此类JavaScript对象的链接(通常通过事件处理程序)时,您就有了一个引用周期。这会导致IE6-7泄漏内存,因为它无法释放循环对象。对于小而简单的应用程序,您可能并不在意。对于复杂的、长期运行的应用程序,您可能需要解决这个问题,例如通过查找映射/数组间接指定每个事件处理程序,这样就不会直接引用DOM对象到实际的事件处理程序