var a={
name:"b",
getname:function(){
return this.name;
}
};
var user=a.getname;
console.log(a.getname());
console.log(user());
var a={
name:"b",
getname:function(){
return this.name;
}
};
var user=a.getname;
console.log(a.getname());
console.log(user());
因为a.getname()方法返回的是当前的对象的name,而当前对象就是a,于是输出b;
但是当你直接调用的时候,其实是相当于直接调用了getname这个函数,该函数的返回值是this.name ,然而此刻的this已经不是对象a了,所以找不到name的值,返回undefined
console.log(a.getname());
a.getname()是直接调用了a的getname函数,this指向a的,所以返回 this.name就是a的name属性,值是b
console.log(user());
var user=a.getname;
用了var声明,把a的getname函数给了全局的user,全局的user没有name属性。所以找不到
首先要明白一点,this指针的指向是根据其调用者来定的,
如果一个函数是自身调用,没有其他的对象调用的话,在非严格模式下,this指针指向的是全局对象,也就是window对象,如果在严格模式下,this指针指向的是undefined,也就是说非严格模式下如果this指针指向了undefined,那么就会默认指向window对象;
再回来看你的问题
1.a.getname(),此时getname这个方法的调用者是a这个对象,那么this指针指向的就是a这个对象所以this.name就是b
2.var user = a.getname;这句话的执行过程是,全局对象下先声明了user这个变量,然后user指向a.getname这个函数,所以调用user()的时候在在非严格模式下其实是window.user(),调用者是window这个全局对象,this指向的是window,然而在window这个对象里面没有找到name这个属性,所以输出的是undefined
这是 this 指向问题。
第一个a.getname()
,this
指向的是a对象,所以调用a对象下的name属性
第二个 赋给了user变量,这时候this
的指向已经不是a对象,找不到该属性
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
3 回答1.3k 阅读✓ 已解决
变量作用域的问题呗,
是user初始化成了一个函数,等同于
这个时候执行user,要返回this.name 这时候要返回就是一个全局变量name,但是这个name并不存在,结果必然是undefined,反之a.getname()返回跟getname同一作用域的变量name,这个name是存在的。