查看以下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)会按预期抛出错误。
有人能解释一下这里发生了什么吗?
答案 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与对象名称相同