You*_*der 9 javascript internet-explorer scope global-variables internet-explorer-8
(在评论之后创建一个单独的问题:Javascript重新声明的全局变量覆盖旧值)
我正在使用方括号表示法创建一个全局范围的变量,并在外部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';
Run Code Online (Sandbox Code Playgroud)
SCRIPT2
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old in IE
Run Code Online (Sandbox Code Playgroud)
在您的html文件中包含这两个文件
<html>
<head></head>
<body>
<script type="text/javascript" src="my.js"></script>
<script type="text/javascript" src="my2.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在Firefox和Chrome中打开此页面警告"旧"这是预期的行为.但是在IE 8中,该页面实际上会提醒"新"
有关为何在IE上发生这种情况的任何想法
简化的测试用例:
<script>
window.foo= 1;
</script>
<script>
var foo;
alert(foo);
</script>
Run Code Online (Sandbox Code Playgroud)
是的,这绝对是IE的JScript引擎中的一个错误.
为什么会这样?为什么IE会做任何疯狂的事情呢?发出恼怒的声音,继续前进,尽量避免这样做......
如果您希望y
成为全球性的,则可以将该var y
行完全删除到第二个文件中。
这背后的原因是,既然你y
无论如何都想成为全球性的,那就将它视为全球性的并且已经声明了。JavaScript 在没有前缀的情况下声明变量时使变量成为全局变量的副作用var
在这种情况下对您有利。在 IE8 中测试,效果很好。
编辑:至于为什么会发生这种情况,我认为这只是 IE 跨文件处理全局变量和声明提升的组合中的一个错误。但实际上,您应该只在一个地方声明任何变量,尤其是全局变量。遵循此经验法则可以避免您的问题。