3

看下面的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时的一种 NPE myImgId

实际发生的情况:现代浏览器(FF 17 及更高版本,chrome)自动获取具有给定 ID 的 DOM 元素。FF 10 等旧版本的浏览器按预期抛出错误。

有人可以解释这里发生了什么吗?

JSFiddle 链接

4

2 回答 2

2

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

我可以使用 ID 作为变量名吗?

这是好东西:(全部引用自 Sidncious 的回答)

自动创建全局变量被认为是不好的做法,因为很难判断,查看一些代码,是故意还是你忘记在某处声明变量。像这样自动创建全局变量在 ES5 严格模式下不起作用,并且可以在未来版本的 ECMAScript 中逐步淘汰。

在浏览器中,JavaScript 的全局作用域实际上是 window。当你引用文档时,你会得到 window.document。在浏览器中创建全局变量的最佳实践是将其添加到窗口(Node.js 中的全局变量)......

...事实证明,大多数浏览器在 window 上为文档中的每个 id 创建属性(因此是全局变量)。许多浏览器不会将它们设为只读,您可以用自己的方式覆盖它们,但 Internet Explorer 可以。

这是 JavaScript 中的全局变量可能很危险的另一个原因——您的一个 id 可能匹配只读窗口属性(现在或将来的某些浏览器中)。

于 2013-10-16T18:05:50.467 回答
-1

我的猜测是:

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

于 2013-10-16T17:59:38.980 回答