【问题标题】:JavaScript undefined variables are auto-defined?JavaScript 未定义的变量是自动定义的?
【发布时间】:2014-02-15 22:03:24
【问题描述】:

JavaScript 是否会自动尝试将未定义的变量定义为:

document.getElementById('someUndefVarName')

如下所示,似乎是等价的:

<div id="myUndefVar">:)</div>
<script>
    alert(myUndefVar); // why does this work!?
    alert(document.getElementById('myUndefVar'));
</script>

参见 JSFiddle 示例:http://jsfiddle.net/AH35k/1/

还是发生了我不明白的其他事情?这真的让我措手不及,因为我使用的是“use strict”,所以我预计会出现某种错误。

【问题讨论】:

  • 查看 JSFiddle 代码,该变量显然没有在任何地方明确定义。
  • 是的。浏览器将从元素 ID 创建全局变量。不过,我不会依赖这种行为。 stackoverflow.com/a/6381766
  • 浏览器为元素“id”值创建全局绑定(window 属性)。
  • @theporchrat:让我们找出答案:jsfiddle.net/AH35k/3 :-D
  • @theporchrat 我个人认为这是一个非常糟糕的主意。 Internet Explorer 很久以前就这样做了,最终其他浏览器都投降了。

标签: javascript


【解决方案1】:

一些(并且只有一些)浏览器根据 ID 创建全局变量。

这在调试时很有用(即在 chrome 控制台中,您只需键入“Blah”即可使用id="Blah" 访问 HTML 元素),但不应依赖于跨浏览器工作.

此外,如果你这样做:

<div id="myUndefVar">:)</div>
<script>
    var myUndefVar;
    alert(myUndefVar);
</script>

或者这个:

<div id="myUndefVar">:)</div>
<script>
    alert(myUndefVar);
    var myUndefVar;
</script>

然后alert 将显示值undefined。如果在同一范围内没有定义其他具有相同名称的 var(包括提升,如第二个示例中所示),它将仅查找元素的命名 ID。

【讨论】:

  • 不支持的浏览器示例:标准模式下的 Firefox。
  • 上面的 var 技巧在 Safari 中不起作用。我只是被它抓住了。你必须明确地为变量赋值。
【解决方案2】:

我相信这个问题的答案可以很好地概括为:

浏览器会根据元素 ID 自动创建全局变量

一个相关问题:javascript variable corresponds to DOM element with the same ID

这似乎是一个非常糟糕的功能,我会避免依赖这种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多