Javascript 默认情况下名称或id可用的元素

Javascript 默认情况下名称或id可用的元素,javascript,html,Javascript,Html,我今天带来了一些代码,我很确定它不会起作用。结果我错了。这适用于IE和Chrome <img onmouseover="why(this)" src="http://placehold.it/150x100" alt="" /> <img onmouseover="why(this)" src="http://placehold.it/100x100" alt="" /> <br> <img id="preview" src="" alt="" />

我今天带来了一些代码,我很确定它不会起作用。结果我错了。这适用于IE和Chrome

<img onmouseover="why(this)" src="http://placehold.it/150x100" alt="" />
<img onmouseover="why(this)" src="http://placehold.it/100x100" alt="" />
<br>
<img id="preview" src="" alt="" />
<img name="preview2" src="" alt="" />
为什么这样做有效?我们不是应该使用
document.getElementById


这是因为默认情况下,所有具有
id
s的元素都会转储到
窗口
对象上,使用它们的
id
作为属性名。有些浏览器对
name
执行相同的操作。由于
窗口
对象是浏览器中的全局对象,这些看似独立的变量被解析为
窗口
的属性

这不是一件值得依赖的事情,因为全局名称空间非常拥挤,而且很容易隐藏这些名称空间。例如:

function preview() { }
现在,具有
id
preview
的元素不再可用作全局符号,因为我已使用函数对其进行了阴影处理。或

var preview;
轰,它不见了

因此,在查找元素时使用
document.getElementById


下面是您的评论:


当我检查窗口对象时,我找不到属性预览。一旦我在函数why中放置断点,window.preview就会突然被定义。知道这是怎么回事吗


我刚刚添加了
window.preview
作为一个监视表达式,它返回
undefined
,直到我点击brekpoint

我希望在解析这些元素时创建属性。因此,这取决于您何时停止并查看
窗口
:如果您在解析器到达那些DOM元素之前查看它,那么这些属性将是
未定义的
。这就是我在本页中看到的:


草稿行
调试器;
调试器;

从第一个
调试器开始语句,一个手表(也使用Chrome的devtools)在
窗口上。testelement
显示
未定义的
,但从第二个
调试器开始语句,它显示div元素。

这应该回答您的问题:当我检查窗口对象时,我找不到属性
preview
。一旦我在函数
why
中放置断点,就会突然定义
window.preview
。你知道这是怎么回事吗?@Jonathan:你是怎么检查窗户的?这些属性仅在JavaScript层中可用,在DOM层中不可用……我刚刚添加了
窗口。preview
作为一个监视表达式,它返回
未定义的
,直到我点击brekpoint。(使用Chrome devtools测试)@Jonathan:我在答案的末尾添加了一个更新。该死,我想我只是在看JSIDdle的
window
对象,
window
刚切换到
iframe
JSIDdle在遇到断点时使用的。。。
var preview;