4

我有以下脚本:

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

如果我在 Chrome 或 Firefox 中执行,我会收到警告对话框打印“嘿”。

如果我在 IE8 中执行,我不会。

显然,这是一段代码,以证明我无法在 IE8 中从窗口访问变量。

有人可以解释为什么会这样吗?

4

1 回答 1

7

该片段显示的不是您无法访问 IE8 中的式全局,而是表明 IE8 中的隐式全局不是enumerable,这是完全不同的事情。

您仍然可以正常访问它:

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 上,输出:

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

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

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

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

  • 具有var全局范围(在 IE8 上,它似乎也创建了一个不可枚举的属性)

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

我已将这些结果(对我来说有点奇怪)添加到我的JavaScript 全局变量答案中,该答案讨论了不同类型的全局变量,因为我没有触及那里的可枚举性。

于 2012-11-26T13:48:53.700 回答