【问题标题】:Global variables undefined when referencing them via window object通过窗口对象引用全局变量时未定义
【发布时间】:2012-10-19 05:04:44
【问题描述】:

我对通过 window 全局声明变量还很陌生,所以我有点惊讶以下 sn-p 的行为因浏览器而异。

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

Firefox、IE、Opera

不错

未定义

不错

Chrome 和 Safari

不错

不错

不错

我最初的想法是它应该像 Chrome 和 Safari 那样运行,但我意识到我可能对 window 对象没有正确的理解,那么有谁更有知识可以解释一下吗?

我意识到我可以将var test = "Good"; 用于该范围,但我对为什么浏览器处理它的方式不同感兴趣。

http://jsfiddle.net/WHYFc/

【问题讨论】:

  • 其他要测试的东西是使用window["test"] 代替window.test,但我确信这些结果会相同。
  • 第三次使用window.test会怎样?
  • 我测试了window["test"],但结果是一样的。在第一次以外的任何时间使用window.test 都会返回undefined
  • 我对通过窗口全局声明变量还很陌生 -> 你最好保持这种状态。 yuiblog.com/blog/2006/06/01/global-domination
  • 这是因为您在文档加载后使用document.write()。您的小提琴设置为运行代码onload,但如果您在此之前运行代码,FF 会给您“很好很好”:jsfiddle.net/WHYFc/2 或者如果您运行onload 但不要使用document.write():@ 987654324@(请注意,jsfiddle 默认将您的 JS 代码放在 onload 处理程序中;您可以通过左侧的下拉菜单进行更改)。 document.write() 几乎总是错误的选择...

标签: javascript reference window undefined


【解决方案1】:

您的 JSFiddle 正在使用 window.load 创建脚本。

加载CLEARS/WIPES文件后的document.write,所以你看到的对于那些浏览器来说是正常的,而webkit只是更宽松

这是您在 jsfiddle 中生成的代码:

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

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

DEMO

【讨论】:

  • 这似乎是答案。我在 Greasemonkey 脚本中遇到问题,在范围内声明 window.ABC 后,我必须使用 window.ABC 而不是 ABC,然后我继续将其剥离为基本要素来询问这里,但我想我没有没想到会发生这种情况。
  • document.write 这样就很棘手。许多人在将一些工作代码重构为一个函数时感到惊讶,称其为 onload 和分页符。而是使用 innerHTML 或 jQuery .html() 或 .text
【解决方案2】:

如果您想在打开新文档的情况下全局存储某些内容,您可以(有点讽刺地)使用 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);

【讨论】:

  • 自从这个问题以来我学到了很多,我现在避免使用全局变量,并且现在除了调试之外几乎所有事情都使用 IIFE。
猜你喜欢
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多