我有以下脚本:
xxx = 12232;
for (var j in window) {
if (j==='xxx') alert('hey');
}
如果我在Chrome或Firefox中执行,我会在警告对话框中打印“嘿”。
如果我在IE8中执行,我不会。
显然,这是一段代码,用来证明我无法从IE8中的窗口访问变量。
有人可以解释为什么会这样吗?
答案 0 :(得分:7)
该片段显示的并不是你无法访问IE8中的implicit global,它表明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上,输出:
Creating implicit global Enumerating window properties Done enumerating window properties Does the global exist? true The global's value is 12232 Also available via window.xxx: 12232
在Chrome上,全局可枚举:
Creating implicit global Enumerating window properties Found the global Done enumerating window properties Does the global exist? true The global's value is 12232 Also available via window.xxx: 12232
隐含全局变量是坏主意 TM 。强烈建议不要使用它们。如果您拥有来创建全局(并且您几乎从不这样做),请明确地执行此操作:
在全局范围内var
(在IE8上,似乎也创建了一个不可枚举的属性)
或者通过分配给window.globalname
(在IE8上,创建一个可枚举的属性)
我已经将这些结果(对我来说有点奇怪)添加到我的JavaScript global variables答案中,该答案讨论了不同类型的全局变量,因为我没有涉及那里的可枚举性。