Redeclared javascript全局变量覆盖IE中的旧值

时间:2010-04-14 05:06:26

标签: javascript internet-explorer internet-explorer-8 global-variables scope

(在评论之后创建一个单独的问题:Javascript redeclared global variable overrides old value

我使用方括号表示法创建一个全局范围的变量,并在外部js文件中为其赋值。

在另一个js文件中,我声明了一个与我刚才创建的var同名的var。注意我没有分配值。由于这是对同一变量的重新声明,因此不应重写旧值,如下所述:http://www.w3schools.com/js/js_variables.asp

使用以下内容创建2个javascript文件: SCRIPT1

//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中,该页面实际上会提醒“新”

关于为什么会在IE上发生这种情况的任何想法?

3 个答案:

答案 0 :(得分:9)

简化测试用例:

<script>
    window.foo= 1;
</script>
<script>
    var foo;
    alert(foo);
</script>

是的,这绝对是IE的JScript引擎中的一个错误。

为什么会这样?为什么IE会做任何疯狂的事情呢?发出恼怒的声音,继续前进,尽量避免这样做......

答案 1 :(得分:4)

如果您希望y是全局的,则可以在第二个文件中完全删除var y行。

这背后的原因是,既然你希望y是全局的,那就把它当作一个全局的并且已经声明了。在没有var前缀的情况下声明变量全局变量的JavaScript副作用在这种情况下对您有利。在IE8中测试过,这很好用。

编辑:至于为什么会发生这种情况,我会把它归结为IE在处理跨文件全局和声明提升的组合中的错误。但实际上,你应该只在一个地方声明任何变量,尤其是全局变量。遵循这条经验法则可以避免您的问题。

答案 2 :(得分:1)

这是在IE中发生的,因为重新声明的行将y设置为未定义。然后,如果未设置y则进行线路测试,并将y更改为“新”。

将第二个脚本更改为:

//redeclaration of the same variable
var y;

alert(y); // is undefined in IE

if (!y) y = 'new';

alert(y); //shows New instead of Old in IE