Das Problem entsteht durch die Tatsache, dass, nachdem ich dem Namen einen Wert zugewiesen habe, der Wert unverändert bleibt, egal wie ich die Seite aktualisiere, was mich ein wenig misstrauisch gegenüber dem Lebenszyklus der js-Variablen macht! Ich bin auch zufällig darauf gestoßen. Im vorherigen Testcode wurde „Name“ nicht definiert und am Anfang wurde kein Wert zugewiesen, aber der Typ des Namens war „String“. Später habe ich das Fensterobjekt ausgedruckt und festgestellt, dass das Objekt den Attributnamen hat und eine leere Zeichenfolge ist, sodass es leicht zu verstehen ist. Aber warum wird dieser Wert nach der Zuweisung nicht mit einer leeren Zeichenfolge initialisiert, sondern existiert immer?
<!DOCTYPE html>
<html>
<head>
<title>web</title>
<meta charset="utf-8">
</head>
<body>
<button id="test">赋值</button></br>
<button id="show">显示</button></br>
<script>
//console.log(typeof name);
var name;
document.getElementById('test').onclick = function() {
name = 'hello word';
}
document.getElementById('show').onclick = function() {
alert(name);
}
//console.log(window);
</script>
</body>
</html>
name你赋值的时候,name='hello word';其实是window.name='hellow world';然后你在看一下window.name的定义是 Gets/sets the name of the window.
我的理解时此时你给这个窗口设置了名称,所以不管你怎么刷新,窗口没有关闭,名称就在;这倒不是js变量的生命周期问题
问题就在于,如果你刷新了页面,就是一个新的运行上下文件,所以东西都回到了初始状态,你给他赋的值已经是上一个运行上下文的事情,怎么会在新刷新出来的上下文中起作用?
哇,我也是第一次见这样的情况,如果放到onload里面就不会出现这种情况,等大牛指导一波。
刚试了一下,确实会将值赋值到 window 对象里面作为属性,F5刷新的时候也不会被刷掉
下面是window 对象的介绍,里面有一句:所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
Window 对象
所有浏览器都支持 window 对象。它表示浏览器窗口。
所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
全局变量是 window 对象的属性。
全局函数是 window 对象的方法。
例如,如果我们定义一个全局变量 name1,也可以在 window 对象中找到。
window 对象,它表示浏览器窗口。 因此只要窗口不关掉,即使F5刷新,里面的值(需要时winow 对象本身就有的属性)就会一直存在。
突然想到一点,还可以利用 window.name 来实现跨域数据传输。
猜测可能跟js的自动转换类型和
typeof
坑有关系,因为把代码换成:log输出的照样是
string
,所以能排除掉是神赋值的问题。刚才顺手查了下 MDN,发现
window
本身有个name
属性(传送门)……MDN上给的信息不多,于是又去参考了下阮老师《JavaScript 标准参考教程》上的相关说明:在name变量还没定义的时候,直接访问的是顶层的
window.name
,这就是个字符串……大概其就是这个意思吧?