今天我在 javascript 高级程序设计第 7 章 上看到这样一段代码
var name = 'window'
var obj = {
name: 'obj',
getName: function () {
return this.name
}
}
obj.getName() // 输出 'obj'
(obj.getName)() // 输出 'obj')
(obj.getName = obj.getName)() // 输出 'window'
我理解为
(obj.getName = obj.getName)()
// 等同于
(function() { return this.name })()
不知这样想是否正确?
然后我又用 let 和 const 试了一下, 结果都输出空字符串, 说以想问下原因何在?
1
suikator 2017-08-03 21:20:08 +08:00
Variable is assigned to itself
This inspection reports any assignments of the form x = x in JavaScript content. These are pointless, and usually indicate programmer error |
2
geelaw 2017-08-03 21:27:27 +08:00 via iPhone
我先提示一下 obj 是 const 的意思是 obj 不能改变引用了哪个对象,并不是对象本身不可改变,在这个例子里 const 不 const 不会有区别
|
3
suikator 2017-08-03 21:35:23 +08:00
在 var name = 'window' 下面 console 一下 this 吧 看看里面有没有 name,我估计没有
研究这些操蛋的东西真的有前途吗 - -! |
4
xrr2016 OP @suikator 肯定有啊,var name = 'window' 的时候 this 就是全局对象.
哈哈. 我也只是今天在看书的时候看到的,也算不上研究吧。 |
5
xrr2016 OP |
6
suikator 2017-08-03 22:14:19 +08:00
@xrr2016
区分 全局中的 this 函数中的 this 构造函数中的 this 以及 this 的指向 chrome 浏览器环境 全局中的 this === windows 此时 (obj.getName = obj.getName)() 输出 'window' 没毛病 其他环境我不清楚 你自己打印吧 我也不是很熟练 js |
7
fulvaz 2017-08-03 22:30:58 +08:00
楼主的问题好有意思,我测试发现了几个问题
问题 1 ---- 楼主的第一段代码就跑不通吧? ``` (obj.getName)() ```` 会产生 TypeError 问题 2 --- 楼主在 console 中分段执行的代码, 如果连在一起执行的话 ``` let name = 'window2' let obj = { name: 'obj', getName: function() { return this.name } } (obj.getName = obj.getName)() ``` Uncaught ReferenceError: obj is not defined 值得研究一番 |
10
RLib 2017-08-03 23:28:39 +08:00
|
11
fulvaz 2017-08-04 00:51:06 +08:00
@RLib 我觉得与作用域无关啊
楼主的代码中有个小坑,就是 window.name 是存在的, 值为"" 楼主迷惑的话可以尝试下这样的代码 代码 1 ---- ``` window.name; // -> "" var name = 123; window.name; // -> 123 ``` var 竟然能修改全局变量的值 代码 2 --- ``` window.name; // "" let name = 123; window.name; // "" ```` let 不会修改全局变量 ------------------------- 总结而言就是...js 的历史遗留问题,var 定义的变量到底保存在哪里。 |
13
RLib 2017-08-04 10:30:52 +08:00 1
@fulvaz 相对来说 let 和 const 是新玩法, var 才是历史产物, 提出 let 就是为了解决`var 任何地方都是全局作用域`而产生的 bug。
window.name 是本来存在, 但因为在 LZ 的代码里并没体现, 所以我说是 undefined, 但这是全局变量, 而声明的是 let, 不等于全局, let 不会影响全局变量尽管它在全局块, 此外, 既然 let 不能修改全局变量, 不也从另一方面表明 let 的变量不在全局作用域里。所以说来说去就是个简单的作用域问题 |
14
xrr2016 OP @RLib 这样说我就明白了, `window.name` 本来就是空字符串,多谢。
|