Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么dom元素作为属性存在于窗口对象上?_Javascript_Html_Dom - Fatal编程技术网

Javascript 为什么dom元素作为属性存在于窗口对象上?

Javascript 为什么dom元素作为属性存在于窗口对象上?,javascript,html,dom,Javascript,Html,Dom,如果我这样编写html: <div id="foo">Foo<div> Foo window.foo返回dom元素,而window.document.getElementById(“foo”)==window.foo返回true 为什么呢?为什么每个人都使用getElementById 另一方面:为什么在IE7/8中禁止重写window.foo?如果我设置window.foo=“bar”?我不确定历史透视图,但HTML 5中的元素是候选元素,如果它们具有id属性,则可

如果我这样编写html:

<div id="foo">Foo<div>
Foo
window.foo
返回dom元素,而
window.document.getElementById(“foo”)==window.foo
返回
true

为什么呢?为什么每个人都使用
getElementById


另一方面:为什么在IE7/8中禁止重写
window.foo
?如果我设置
window.foo=“bar”

我不确定历史透视图,但HTML 5中的元素是候选元素,如果它们具有
id
属性,则可以直接作为
window
对象上的属性公开:

窗口接口支持命名属性。支持的属性 任何时候的名称都由以下内容组成,按树的顺序排列,忽略 以后的副本:

[……]

  • 具有非空id内容属性的活动文档中任何HTML元素的id内容属性的值
此定义的问题在于,它仅保证如果存在
Foo
,则将定义
window.Foo
。它不能保证其值的准确值(请阅读规范中关于如何确定该值的规则;例如,)


因此,“为什么要使用
getElementById
ever?”的答案很简单:因为您可以依靠它返回您所期望的内容,而不需要考虑整个文档。

通常,将某些内容放在window对象中会使其成为全局对象。例如:

var A = function() {
    window.test = "bla";
    console.log(test);
}
var B = function() {
    console.log(test);
}

A();
B();
然而,这不是一个好的做法。您不应该依赖任何全局对象,因为您可能希望将代码移动到没有窗口的浏览器中。或者以nodejs为例


我发现window.foo有点错误,因为您可能有创建名为foo的全局变量的代码。因此,使用getElementById可以确保始终获得DOM元素。

Window.foo在您的场景中运行良好,但是如果Id类似于“foo test”而不是“foo”,您可以看到它将不起作用。这是因为Javascript变量不允许包含破折号。。。。
然而,在document.getElementById的情况下,它可以正常工作。getElementById

窗口[“foo test”]
。是的,在这里,您得到了哈希表并按键在其中搜索,但直接将其作为对象访问会产生问题,请尝试以下操作:var foo test='hi';警报(window.foo测试);从技术上讲,
window.foot
也是按键在哈希表中搜索。@AbhishekJain:“按键搜索哈希表”和“作为对象直接访问”是您选择使用的表达式。两种情况下实际发生的情况完全相同,只是语法不同。当然你不能使用
window.foo test
,但这仍然不能回答“为什么要使用
getElementById
?”@Jon谢谢你提供的信息。.环顾四周后,我意识到还有一点:谢谢,@Jon的快速回答,还有我没有找到的“副本”。