问题引发自我给name赋值之后无论怎么刷新页面这个值都不变,让有有点怀疑js变量的生命周期了!也是偶然碰到的。上一段测试代码,一开始没有定义name,也没有赋值,但是typeof name 是 string。后来打印出window对象,发现对象中有name这个属性,而且是个空字符串,那么也好理解。但是为什么赋值之后,这个值不是初始化为空字符串而是一直存在呢?
<!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>
某草草2017-05-19 10:47:19
name你赋值的时候,name='hello word';其实是window.name='hellow world';然后你在看一下window.name的定义是 Gets/sets the name of the window.
我的理解时此时你给这个窗口设置了名称,所以不管你怎么刷新,窗口没有关闭,名称就在;这倒不是js变量的生命周期问题
阿神2017-05-19 10:47:19
问题就在于,如果你刷新了页面,就是一个新的运行上下文件,所以东西都回到了初始状态,你给他赋的值已经是上一个运行上下文的事情,怎么会在新刷新出来的上下文中起作用?
迷茫2017-05-19 10:47:19
刚试了一下,确实会将值赋值到 window 对象里面作为属性,F5刷新的时候也不会被刷掉
下面是window 对象的介绍,里面有一句:所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
Window 对象
所有浏览器都支持 window 对象。它表示浏览器窗口。
所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
全局变量是 window 对象的属性。
全局函数是 window 对象的方法。
例如,如果我们定义一个全局变量 name1,也可以在 window 对象中找到。
window 对象,它表示浏览器窗口。 因此只要窗口不关掉,即使F5刷新,里面的值(需要时winow 对象本身就有的属性)就会一直存在。
突然想到一点,还可以利用 window.name 来实现跨域数据传输。
淡淡烟草味2017-05-19 10:47:19
猜测可能跟js的自动转换类型和typeof
坑有关系,因为把代码换成:
console.log(name);
console.log(typeof name);
var name;
document.getElementById('test').onclick = function () {
name = 28;
}
document.getElementById('show').onclick = function () {
alert(name);
}
console.log(window);
log输出的照样是string
,所以能排除掉是神赋值的问题。
刚才顺手查了下 MDN,发现window
本身有个name
属性(传送门)……MDN上给的信息不多,于是又去参考了下阮老师《JavaScript 标准参考教程》上的相关说明:
在name变量还没定义的时候,直接访问的是顶层的window.name
,这就是个字符串……大概其就是这个意思吧?