谷歌浏览器中JavaScript记忆异常

7

我在index.html中有以下内容:

<html><body><pre>
<script src="program.js"></script>
</pre></body></html>

接下来是program.js中的内容:

document.writeln(JSON.stringify(name));
name = "Bob";

第一次打开index.html时,会产生以下内容(输出A):

> ""

然后,刷新页面后,将生成以下内容(输出B):
> "Bob"

我在Firefox中从未看到输出B。

回到Chrome:如果我使用除'name'之外的某些变量,例如'val':

document.writeln(JSON.stringify(val));
val = "Bob";

我遇到了一个异常:

Uncaught ReferenceError: val is not defined 

因此,由于“name”恰好在全局范围内,我认为Chrome从旧页面加载中以某种方式记忆了全局变量,并在新页面加载中设置这些变量的默认值。但是,如果我改用全局变量“status”,则始终会看到输出A。
为什么会发生这种情况?

感兴趣的是,如果您有两个不同的页面使用相同的代码,它是否会跨页面记住值?这将特别严重... - Jeff
1
看起来我们正在更改窗口对象的名称。只要窗口保持打开状态,它就会被保存。可能需要进一步调查。 - Arun P Johny
是的,您正在将window对象的name属性设置为全局作用域时使用的隐式window命名空间。 - Fabrício Matté
如果有人把那个作为答案,我会给他点赞。 - Jeff
我不太擅长解释这种事情,而且W3C规范对属性的持久性没有任何说明(尽管这可能被认为是有点显而易见的),至少在Chrome和Firefox中是这样的。 - Fabrício Matté
显示剩余3条评论
1个回答

2
看起来在Chrome浏览器中,全局上下文中的name变量是一种保留名称,类似地,像status这样的变量只能采用String值。
name属性指的是窗口对象的名称,只要窗口存在,它就会被保存,因此该值在多个文档之间共享。
例如:var status = {}; alert(status)将显示[Object object]name也是如此。
我没有任何参考文献来说明这种行为,但这是我在我的一个项目的错误报告中发现的结果。

“多个文档共享”,您是指多个选项卡吗?如果我在一个选项卡中打开index.html,然后在另一个选项卡中打开index.html,则两个选项卡中都会显示输出A。只有在刷新页面后,我才能观察到输出B。 - Robz
查了一下,我认为这不仅仅是Chrome的问题,因为我在MDN文档中找到了它:https://developer.mozilla.org/en-US/docs/DOM/window.name。但是我不知道为什么它在Firefox和Chrome中表现不同。 - kennypu
不会在多个标签页之间共享,只会在更改名称的标签页中生效。 - Arun P Johny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接