在IE8中从window对象访问变量无法正常工作

4
我有以下脚本:

xxx = 12232;
for (var j in window) { 
    if (j==='xxx') alert('hey');
}

如果我在Chrome或Firefox中执行,将会弹出警示对话框打印“hey”。
如果我在IE8中执行,则不会弹出警示对话框。
显然,这是一段代码片段,旨在证明我无法从window中访问变量。
有人能解释一下为什么吗?

1
你应该查看这个链接获取更多信息:Javascript全局变量 - AlexandruSerban
@nameIsNull 是的,我看了一下。虽然不是同一个问题,但那里也有非常有用的信息。 - Zo72
1个回答

7
那个代码片段展示的并不是你不能在IE8中访问隐式全局变量, 它展示的是在IE8中隐式全局变量不是可枚举的,这是完全不同的事情。
你仍然可以正常访问它:
display("Creating implicit global");
xxx = 12232;
display("Enumerating window properties");
for (var j in window) { 
  if (j==='xxx') {
    display("Found the global");
  }
}
display("Done enumerating window properties");
display("Does the global exist? " + ("xxx" in window));
display("The global's value is " + xxx);
display("Also available via <code>window.xxx</code>: " +
        window.xxx);

function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = String(msg);
  document.body.appendChild(p);
}

复制现场 | 源代码

对我而言,在IE8上,输出如下:

创建隐式全局变量
枚举窗口属性
完成窗口属性枚举
全局变量存在吗?true
全局变量的值为12232
也可以通过window.xxx获得:12232

在Chrome上,全局变量是可枚举的:

创建隐式全局变量
枚举窗口属性
找到了全局变量
完成窗口属性枚举
全局变量存在吗?true
全局变量的值为12232
也可以通过window.xxx获得:12232

隐式全局变量是一个坏主意TM。强烈建议不要使用它们。如果你必须创建一个全局变量(你几乎从不需要这样做),请明确地声明:

  • 在全局作用域中使用var(在IE8上似乎还会创建一个不可枚举的属性)

  • 或通过分配给window.globalname(在IE8上创建一个可枚举的属性)

我已将这些结果添加到我的JavaScript全局变量答案中,该答案讨论了不同类型的全局变量,因为我没有涉及可枚举性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接