Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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未定义的变量是否自动定义?_Javascript - Fatal编程技术网

JavaScript未定义的变量是否自动定义?

JavaScript未定义的变量是否自动定义?,javascript,Javascript,JavaScript是否会自动尝试定义未定义的变量以: document.getElementById('someUndefVarName') 与中一样,以下内容似乎是等效的: <div id="myUndefVar">:)</div> <script> alert(myUndefVar); // why does this work!? alert(document.getElementById('myUndefVar')); </s

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

document.getElementById('someUndefVarName')
与中一样,以下内容似乎是等效的:

<div id="myUndefVar">:)</div>
<script>
    alert(myUndefVar); // why does this work!?
    alert(document.getElementById('myUndefVar'));
</script>
:)
警报(myundefar);//为什么这样做!?
警报(document.getElementById('myundefar');
请参见JSFIDLE示例:


还是发生了我不明白的事情?这真的让我措手不及,因为我在使用“严格使用”时预期会出现某种错误。

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

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

一个相关问题:

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

一些(而且只有一些)浏览器从ID创建全局变量

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

此外,如果您这样做:

<div id="myUndefVar">:)</div>
<script>
    var myUndefVar;
    alert(myUndefVar);
</script>
:)
var-myvar;
警报(myvar);
或者这个:

<div id="myUndefVar">:)</div>
<script>
    alert(myUndefVar);
    var myUndefVar;
</script>
:)
警报(myvar);
var-myvar;

然后,
警报
将显示值
未定义
。如果在同一范围内没有定义具有相同名称的其他变量(包括提升,如第二个示例),它将只查找元素的命名ID。

请参阅JSFIDLE代码,该变量显然没有在任何地方明确定义。是。浏览器将从元素ID创建全局变量。不过,我不会相信这种行为。浏览器为元素“id”值创建全局绑定(
window
properties)。@theporchrat:让我们来了解一下:-D@theporchrat我个人认为这是一个非常糟糕的主意。Internet Explorer很久以前就这样做了,最终其他浏览器屈服了。一个不这样做的浏览器示例:标准模式下的Firefox。上面的var技巧在Safari中不起作用。我只是被它弄糊涂了。您必须显式地为变量赋值。