js的输出结果为什么第一个是"b",第二个是undefined?

var a={
name:"b",
getname:function(){
return this.name;
}
};
var user=a.getname;
console.log(a.getname());
console.log(user());

阅读 3.4k
6 个回答

变量作用域的问题呗,

var user=a.getname;

是user初始化成了一个函数,等同于

var user=function(){
return this.name;
};

这个时候执行user,要返回this.name 这时候要返回就是一个全局变量name,但是这个name并不存在,结果必然是undefined,反之a.getname()返回跟getname同一作用域的变量name,这个name是存在的。

因为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对象,找不到该属性

this 作用域知识点

简单说谁调用this就指向谁

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题