首先,我们先来看看一段代码。大家看看这里的a()打印的会是什么呢?
let name = {
user: "Joker",
get: function () {
return function () {
return this.user
}
}
};
let a = name.get();
console.log(a());
可能有些小伙伴会觉得,打印的结果是Joker,但答案并不是,当我们打开控制台,看到的却是undefined。
这是为什么呢?因为我们把get函数赋值给了变量a,换句话说变量a就是get函数,当我们打印a()的时候,相当于执行了name.get()(),也就是执行了这个函数。
但我们是在window对象下执行的这个函数,因此这个函数里面的this就默认指向调用者,也就是说这里面的this指向的是window。但是在window对象下是没有一个属性名叫user的,所以打印结果会是undefined。
如果我们想正确拿到name对象下的user值,有两种办法。
第一种:用一个变量将get函数下的this指向存起来。
let name = {
user: "Joker",
get: function () {
let This = this;
return function () {
return This.user
}
}
};
let a = name.get();
console.log(a());
第二种:使用ES6新增的箭头函数。因为在箭头函数中我们是没有this指向的,因此会默认向上一级作用域中寻找this指向,而在get函数中我们的this是指向name对象的,因此就能顺利获取到user的属性值了。
let name = {
user: "Joker",
get: function () {
return ()=>{
return this.user
}
}
};
let a = name.get();
console.log(a());