首页 新闻 搜索 专区 学院

关于this的一点问题

0
[待解决问题]
 1 function Person(name){
 2     var o = new Object();
 3     o.name=name;
 4     o.sayname=function(){
 5         alert(name);//这里没加this
 6     }
 7     return o;
 8 }
 9 
10 var p = Person('xia');
11 p.name="wang";
12 p.sayname();//xia
13 
14 /*我的问题是*/
15 /*为什么sayname函数打印的name值不随对象o.name而变化呢?*/
16 /*既然函数Person返回的是对象o那么调用sayname函数作用域肯定是在o对象内*/
17 /*那么第5行那里加不加this应该都没有区别才对呀*/
帕特菛琦的主页 帕特菛琦 | 菜鸟二级 | 园豆:206
提问于:2018-02-10 00:12
< >
分享
所有回答(3)
0

你alert引用的参数name,返回的对象o中alert还是引用的name,这个name和o的name没有关系。

流年飞雨 | 园豆:1978 (小虾三级) | 2018-02-10 03:21

我调用alert的时候用的是p.sayname(),p应该是返回的对象o,那么name也应该是对象o作用域里面的name即o.name才对呀?

支持(0) 反对(0) 帕特菛琦 | 园豆:206 (菜鸟二级) | 2018-02-10 12:19

@帕特菛琦: name不就是一个名字吗,你考虑他们的地址,传参传了一个地址过来,你alert的name的地址是参数的地址,所以打印的是参数的内容,你的p.name开始也有一个地址,也是参数的地址,然后你又赋了一个wang给p.name,p.name的地址就变成了wang的地址,你alert的name的地址还是参数name的地址,它不会变成wang的地址

支持(0) 反对(0) 流年飞雨 | 园豆:1978 (小虾三级) | 2018-02-10 13:59
0

对啊,你alert的是name,又不是o.name 

JackWuhu | 园豆:211 (菜鸟二级) | 2018-02-10 12:00

我调用alert的时候用的是p.sayname(),p应该是返回的对象o,那么name也应该是对象o作用域里面的name即o.name才对呀?

支持(0) 反对(0) 帕特菛琦 | 园豆:206 (菜鸟二级) | 2018-02-10 12:20
0

这涉及到作用域链查找和对象的概念....

没有添加this:

你调用sayname的时候js开始执行作用域链查找..找name,,第一步找sayname方法...发现没有申明name,,接着找Person的方法...OK.这时找到了name参数..所以就alert "xia"

 

添加this

调用sayname将首先确定this的上下文...this指向o这个对象..OK,,这个简单了...直接alert "wang"

 

推荐没事的时候看看<javascript高级程序设计>看完之后你对js的认识会有值的提升...

cn-troy | 园豆:106 (初学一级) | 2018-02-10 19:23

问题就在这里:

  你调用sayname的时候js开始执行作用域链查找..找name,,第一步找sayname方法...发现没有申明name,,接着找Person的方法。

 

  sayname()函数的活动对象肯定是在作用域链的第一个位置,下一个位置应该是对象o的变量对象,再往下才是Person的活动对象,引擎为什么在不加this的情况下跳过O的变量对象直接去Person找了呢?

支持(0) 反对(0) 帕特菛琦 | 园豆:206 (菜鸟二级) | 2018-02-10 22:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册