说实话这个问题一开始学的时候有点迷,但是仔细思索之后就感觉非常明朗.
废话不多说我们直接上代码:
var name = '小二';
let user = {
name: '张三',
obj: function() {
let user = {
name: '李四',
obj: function() {
console.log(this.name);
}
}
user.obj();
}
}
user.obj();
此时输出的this.name为李四,因为obj方法在user对象作为属性时,this指向父对象,所以我们能找到name=李四。
若想引用父对象的父对象则可以使用箭头函数为obj赋值:
var name = '小二';
let user = {
name: '张三',
obj: function() {
let user = {
name: '李四',
obj: () => {
console.log(this.name);
}
}
user.obj();
}
}
user.obj();
此时输出的为张三,因为obj赋值是使用了箭头函数,而使用箭头函数会引用父对象的this,作为当前对象的this。,即目前的this指向最外层user。
若最外层obj,也使用箭头函数则:
var name = '小二';
let user = {
name: '张三',
obj: () => {
let user = {
name: '李四',
obj: () => {
console.log(this.name);
}
}
user.obj();
}
}
user.obj();
此时的this.name会继承父对象的this,输出为小二,而父对象是处于箭头函数之中,会找到全局的window进行继承,此时的this其实是指向windows。
总结:普通函数在对象中作为属性this会引用当前对象,而箭头函数在对象中作为属性会继承父对象的this。