这个问题在这里已有答案:
- 带有id的DOM树元素是否成为全局变量? 4个答案
起源
答案:
以下示例在不使用“document.getElementById('myId')”的情况下工作。为什么这样,可以跳过“document.getElementById('myId')”?
因为浏览器会转储对所有元素的引用 id
进入全局命名空间,使用 id
作为变量名称。 (从技术上讲,作为 属性 全局对象上的名称;全局对象的属性是全局变量。)我强烈建议 不 依靠它并使用 document.getElementById
(或类似的)代替。全局命名空间是 真的很拥挤 还有很多其他可能会发生冲突的事情。
例如,如果你有
<div id="foo">...</div>
和
function foo() {
}
然后只是使用 foo
在你的代码中将为您提供函数,而不是元素。
同样,如果你有
<input type="text" id="name">
......并使用 name
在你的代码中,你将获得窗口的名称(一个字符串),而不是 HTMLInputElement
为您 id="name"
领域。
将对元素的引用转储到全局命名空间的业务包括在内 HTML5规范的§5.2.4在这种情况下,很大程度上记录了浏览器长期以来所做的事情。
如果我不将ID存储在变量中,或者它是如何变量的,那么它是否会更多DOM遍历?
它已经是上面的全局变量,所以没有额外的DOM遍历。在深度嵌套的函数中,可能会有更多的范围链遍历,但这不太可能是一个主要问题。
但是,我强烈建议 不 依靠自动元素全局变量。相反,将代码包装在作用域函数中(如您所示),并有意地获取元素 getElementById
, querySelector
, querySelectorAll
等等,视情况而定。如果你依赖自动全局变量,最终你会被冲突所困扰。但这是意见。
请注意查找元素 getElementById
是 真的很快,因此出于性能原因通常不需要缓存引用(您可能希望出于其他原因这样做,例如编码方便)。用选择器查找(querySelector
, querySelectorAll
)有点慢,但是如果出现问题,我会担心它。 :-)