前几天我遇到了一个有趣的问题,想知道是否有人可以解释为什么会发生这种情况。这是我正在做的事情(出于本示例的目的,我稍微简化了示例):
- 我正在使用方括号表示法创建一个全局范围的变量并为其分配一个值。
-
后来我声明了一个与上面刚刚创建的变量同名的变量。请注意,我没有分配值。由于这是同一变量的重新声明,因此旧值不应被覆盖,如下所述:http://www.w3schools.com/js/js_variables.asp
//create global variable with square bracket notation
window['y'] = 'old';
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old
问题是旧值实际上确实被覆盖了,在上面的例子中。警报显示“新”而不是“旧”。为什么 ?
我想陈述我的问题的另一种方式是上面的代码在语义方面与下面的代码有何不同:
//create global variable
var y = 'old';
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows Old
Update 1:根据一些评论和答案,我正在重新表述该示例,以更好地反映我原来的问题。 罢工>
创建 2 个包含以下内容的 javascript 文件:
脚本1
//create global variable with square bracket notation
window['y'] = 'old';
Script2
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old in IE
将这两个文件包含在您的 html 文件中
<html>
<head></head>
<body>
<script type="text/javascript" src="my.js"></script>
<script type="text/javascript" src="my2.js"></script>
</body>
</html>
在 Firefox 和 Chrome 中打开此页面会提醒“旧”,这是预期的行为。然而在 IE 8 中,页面实际上会警告“新”
当你重新声明时y
with var y;
,现在是未定义的,所以if(!undefined)
评估为真。
在您的示例中添加另一个警报以查看此内容:
//create global variable with square bracket notation
window['y'] = 'old';
//redeclaration of the same variable
var y;
alert(y); //undefined
if (!y) y = 'new';
alert(y); // new
var
不会两次初始化一个变量,但它会覆盖第一次未初始化的变量(因为它是一个新的、更局部的变量),window['y']
style 执行此操作,将其添加到 window 对象。以此为例:
//create global variable with square bracket notation
window['y'] = 'old';
//redeclaration of the same variable
var y;
alert(y); //undefined
alert(window.y); //old
if (!y) y = 'new';
alert(y); //shows New instead of Old
alert(window.y); //still old
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)