JS中未声明的变量自动获取DOM对象

时间:2013-10-16 17:57:08

标签: javascript html browser

查看以下JS代码:

alert(myImgId.src);

和相应的HTML:

<img id="myImgId" src="http://images4.wikia.nocookie.net/__cb20121128141533/logopedia/images/6/6f/Superman_logo.png"></img>

我期望会发生什么: 一个javascript错误,指出它无法找到变量myImgId,在访问src的对象myImgId时基本上是一种NPE。

实际发生的事情: 现代浏览器(FF 17&amp; above,chrome)自动获取具有给定ID的DOM元素。 较早版本的浏览器(如FF 10)会按预期抛出错误。

有人能解释一下这里发生了什么吗?

JSFiddle link

2 个答案:

答案 0 :(得分:2)

我从另一个问题中收集了这个问题,问题与你的问题并不完全相同,但答案确实回答了你的问题:

Can I Use an ID as a Variable Name?

这是好东西:(所有引自Sidnicious的回答)

  

自动生成全局变量被认为是不好的做法   因为它很难说,看一些代码,是否它   是故意的,或者你忘了在某个地方声明一个变量。自动   像这样创建全局变量在ES5严格模式下不起作用   并且可以在ECMAScript的未来版本中逐步淘汰。

     

在浏览器中,JavaScript的全局范围实际上是窗口。当你   请参阅您获得window.document的文档。创建的最佳实践   浏览器中的全局变量是将其添加到窗口(全局变量)   的Node.js)......

     

...事实证明,大多数浏览器都会在窗口上创建属性(因此   全局变量)用于文档中的每个id。许多浏览器都没有   让它们只读,你可以用自己的覆盖它们,但是   Internet Explorer可以。

     

这是JavaScript中全局变量可能存在危险的另一个原因    - 您的一个ID可以匹配只读窗口属性(今天或在   一些未来的浏览器)。

答案 1 :(得分:-1)

我的猜测是:

由于您没有使用var声明变量,因此它被视为全局变量(整个窗口的全局变量),并且浏览器会自动将其挂起,因为ID与对象名称相同