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

怪吗?

2032 次点击
所在节点    问与答
25 条回复
deleteDB
2017-06-21 08:57:16 +08:00
要写 alert(this.name)
Fishdrowned
2017-06-21 08:57:32 +08:00
不怡啊,这根本不是作用域,少年你混淆概念了。
Rice
2017-06-21 08:57:58 +08:00
这样你就觉得怪了?

```
window.name = 'abc';
var obj = {}
obj.name = '123'
obj.getName = function () {
alert(this.name)
}
obj.getName() // 123
var a = obj.getName;
a();
```

那这样呢?
pandasjw
2017-06-21 08:58:54 +08:00
这是全局变量的问题吧。。。
jtsai
2017-06-21 09:01:42 +08:00
@Rice 你这个是 this 作用域的问题。可以被理解,我那个是变量加载的问题,为什么变量是这样加载的
Rice
2017-06-21 09:04:25 +08:00
@jtsai #5 可能是因为 js 没有类的概念吧。
Rice
2017-06-21 09:10:56 +08:00
@jtsai #5
你这样想吧,js 不是现在这样设计
而是对象方法调用的时候,先查找有没有当前对象的 name 值,然后没有再向上查找,这样会发生什么后果。
这样的后果就是,如果这个对象一开始就没有 name 值,调用的时候就是全局变量 name
结果被人后来修改了,加上 name,调用就是对象的属性 name。
R18
2017-06-21 09:16:12 +08:00
你的意思是 应该 alert 123 吗?但是你的 123 是赋值给了一个对象的属性 对象属性的调用是 obj.name 你直接使用 name 是会逐层寻找这个变量 最后就找到了全局中的 name
jin5354
2017-06-21 09:18:04 +08:00
在 ES6 前只有函数作用域和全局作用域,不要靠惯性和臆测写代码
morethansean
2017-06-21 09:19:53 +08:00
连续两天见到同一个问题了,到底是谁教你们的调对象下面的函数,对象的属性就会被自动加到 scope chain 里啊?
secondwtq
2017-06-21 09:23:15 +08:00
@jtsai 你用 Python 写 method 访问实例变量不也是要写 self
sliwey
2017-06-21 09:26:08 +08:00
不怪
jtsai
2017-06-21 09:27:43 +08:00
@Rice
@R18
@jin5354
@morethansean
@secondwtq

@Rice
```
name = 'abc'

class obj():
def __init__(self):
self.name = '123'

def getName(self):
print(name)

obj().getName() # abc
```

其实只是 js 的表达看起来有点怪 这样就很正常了。一直都是这样的。
Rice
2017-06-21 09:31:29 +08:00
@jtsai #13 我刚才突然想到动态语言是不是都这样,正打算看 Python 里的类是不是也是这样。
luchenqun
2017-06-21 09:34:58 +08:00
http://t.cn/Ro5N24k
此问题到此终结!
vincedd
2017-06-21 09:50:46 +08:00
@luchenqun 哈哈哈哈哈
Rice
2017-06-21 09:52:11 +08:00
@luchenqun #15 我看你是连我们在讨论什么都没看吧。
jtsai
2017-06-21 09:53:22 +08:00
@luchenqun 老板,我这题跟 this 没有半毛钱关系
BlackLynx
2017-06-21 10:07:48 +08:00
九楼十楼正解
DUSTINTHEWIND
2017-06-21 10:52:53 +08:00
这个昨天一个帖子的问题一模一样

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

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

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

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

© 2021 V2EX