js 作用域问题?

2017-06-21 08:50:55 +08:00
 jtsai
window.name = 'abc';
window.getName = function () {
	alert(name)
}
window.getName() // abc

var obj = {}
obj.name = '123'
obj.getName = function () {
	alert(name)
}
obj.getName() // abc

怪吗?

2148 次点击
所在节点    问与答
25 条回复
xxfan
2017-06-21 11:27:43 +08:00
少年可以看高程 4.2 节来理解一下执行环境和作用域链.
我的理解是,作用域链,0 位是当前执行环境,也就是当前的 function(){} 花括号内的,显然 getName 这个函数内没有定义 name,找不到.
然后再后一位,就是 window 这个执行环境了,window 中可以找到 name.返回 abc.

obj 并不是 getName 的执行环境,不在作用域链内,它只是"调用环境",也就是调用这个函数的对象而已.(所以 this 的话指向 obj,而作用域不包含它)
sunjourney
2017-06-21 13:54:47 +08:00
为什么怪,有什么其它语言 obj.getName() 会是 123 ?不是 123 我才要惊了
jtsai
2017-06-21 14:10:36 +08:00
@sunjourney
我感觉有点怪是因为
window instanceof Object // ture
obj instanceof Object // ture
window.toString === obj.toString // true

咋一看差不多的
xiaojunjor
2017-06-21 14:56:53 +08:00
@luchenqun 哈哈哈哈哈哈,这个笑死我了
Tokin
2017-06-22 09:59:44 +08:00
@sunjourney JavaScript 中的任何一个全局函数或变量都是 window 的属性。
在 obj.getName 里调用的 name 是全局的 name 啊,如果要掉 obj 的 name 需要 this.name 或者 obj.name 不是吗?好奇。。。
式作用域的问题?调错了的可能性大吧。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX