使用JavaScript,为什么可以使用window对象在页面之间传递值?

使用JavaScript,为什么可以使用window对象在页面之间传递值?,javascript,security,Javascript,Security,我在一个HTML页面上做了一些实验,然后说如果我做了 name = "hmm"; console.log(name); 我把它放在谷歌浏览器里,自然地显示出“嗯” 问题是,如果我删除第一行或注释掉它,然后重新加载页面,它将再次显示“hmm”。如果我创建另一个网页index2.html,并且只执行 console.log(name); 然后将我浏览器中的URL从index.html更改为index2.html,它将再次显示“hmm” 因此,我认为这是由于window.name具有此值。但是,我

我在一个HTML页面上做了一些实验,然后说如果我做了

name = "hmm";
console.log(name);
我把它放在谷歌浏览器里,自然地显示出“嗯”

问题是,如果我删除第一行或注释掉它,然后重新加载页面,它将再次显示
“hmm”
。如果我创建另一个网页
index2.html
,并且只执行

console.log(name);
然后将我浏览器中的URL从
index.html
更改为
index2.html
,它将再次显示
“hmm”

因此,我认为这是由于
window.name
具有此值。但是,我从来不知道两页可以分享这样的价值观。我认为
窗口
对象应该重新开始,不应该带有任何值

它只在
name
时发生。这不会发生在
foo
上,但我仍然认为,即使
name
也不应该继续

发生了什么事?那个么跨网站(跨域?)呢?那个真的不应该发生,即使是同一个网站,是吗

我从来都不知道两页可以分享这样的价值观

嗯。通常情况下,他们不会。之所以会出现这种情况,是因为您使用了特定的变量名
name
,并在全局范围内使用了它,在全局范围内,它的含义与同名的
窗口
属性相同

window.name
是一个奇怪的东西,可以追溯到跨文档脚本编写的早期。作为一种设计,它在今天毫无意义,但要摆脱旧的网络行为是非常困难的

当Netscape在Navigator 2.0中引入JavaScript和框架时,安全性并不是第一要务。网络是一个不同的、威胁较小的地方,出于商业原因,他们更关心的是在浏览器中添加任何和所有可能的功能,而不是设计一个连贯和安全的平台

同一原产地政策还处于起步阶段,并没有被视为基本的保障措施,更像是一种不受欢迎的阻碍,等待着更好、更宽松的设计。他们有一种被列入黑名单的本能:在默认情况下添加功能并允许访问,除非证明这是一个安全问题

弹出窗口上的
window.name
属性反映了
window.open
方法的
name
参数,该方法被调用以打开该窗口;在框架上,它反映了包含它的
(或
)元素的
name
属性。脚本希望通过
name
访问和导航相关窗口(甚至子窗口,例如框架内的框架),即使是跨不同的域,甚至是在导航原始文档时也是如此。(*)

因此,
窗口
的许多属性(包括
名称
)都可以从源站之外访问,并且为了兼容性,由于浏览器安全漏洞层出不穷,因此产生了大量复杂的警告和限制

(*事实证明,没有多少人希望这样做,但他们确实希望能够在不同域上的两个窗口之间传递字符串数据。现在,我们只使用
window.postMessage
,它是专为这个明确的目的而设计的,但当时唯一的方法是使用对双方进行读写的唯一属性,
name
。这是一个笨拙且有限的过程,但许多现有网站都做到了这一点,因此很难从web平台中删除。)


结果:将内容放入
窗口
可能会产生不可预见的后果,因此请尽量将全局变量保持在绝对最小值,并避免现有属性,如
name

您正在设置现有的特殊属性。使用
var
不使用全局变量scope@m.antkowicz使用
var
将得到相同的结果。。。当你在全局范围内使用
var
时,如果与不使用它不完全相同,或者与使用
window.name
?在闭包中使用
var
可以避免这些问题。@Oriol你的意思是使用具有局部范围的IIFE。我认为闭包的概念在这里不是真正相关的。我它与局部范围更相关