通过窗口对象引用全局变量时未定义它们

问题描述 投票:0回答:2

我对通过 window 全局声明变量还很陌生,所以我对以下代码片段根据浏览器的不同而表现不同感到有点惊讶。

window.test = "Good";
document.write(window.test);
document.write('<br>');
document.write(window.test);
document.write('<br>');
document.write(test);​

火狐、IE、Opera

未定义

Chrome 和 Safari

我最初的信念是它应该像 Chrome 和 Safari 那样运行,但我意识到我可能对 window 对象没有正确的理解,所以有更了解的人可以解释一下吗?

我意识到我可以在该范围内使用

var test = "Good";
,但我感兴趣的是为什么浏览器会以不同的方式处理它。

http://jsfiddle.net/WHYFc/

javascript reference window undefined
2个回答
2
投票

您的 JSFiddle 正在使用窗口加载事件来创建脚本。

加载后的 document.write 会清除/擦除文档,因此您所看到的内容对于这些浏览器来说是正常的,而 webkit 只是更宽松

这是 jsfiddle 中的代码:

window.addEventListener('load', function() {
  window.test = "Good";
  document.write(window.test);
  document.write('<br>');
  document.write(window.test);
  document.write('<br>');
  document.write(test);
});

将你的小提琴更改为头部或身体,它将按预期工作


0
投票

如果您想在全局存储某些内容,即使您正在打开新文档,您也可以(有点讽刺的是)使用

document
对象,它似乎是持久的。

document.test = "Good";

document.write(document.test); // > "Good"
document.write('<br>');
document.write(document.test); // > "Good"
document.close();

setTimeout(() => {
    document.write("Also " + document.test); // > "Also Good"
    document.close();
}, 2000);
© www.soinside.com 2019 - 2024. All rights reserved.