我对通过 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";
,但我感兴趣的是为什么浏览器会以不同的方式处理它。
您的 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);
});
将你的小提琴更改为头部或身体,它将按预期工作
如果您想在全局存储某些内容,即使您正在打开新文档,您也可以(有点讽刺的是)使用
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);