体验下面的练习,就能理解 this 指向和箭头函数里面的 this 指向。
var name = "window"
var obj1 = {
name: '1',
fn1: function(){
console.log(this.name)
},
fn2:() => console.log(this.name),
fn3:function() {
return function() {
console.log(this.name)
}
},
fn4:function() {
return() => console.log(this.name)
}
}
var obj2 = {
name: '2'
}
obj1.fn1() //1
obj.fn1.call(obj2) //this指向obj2 2
obj1.fn2() //找父作用域里面的name 就是 window
obj1.fn2.call(obj2) //不支持显示绑定 还是 window
obj1.fn3()() //返回的函数是独立调用 所以this指向 window
obj1.fn3().call(obj2) //返回的函数显示绑定给了obj2 所以this指向obj2 2
obj.fn3.call(obj2)() //改变了父级作用域的this指向即指向obj2 但是内部函数还
是独立调用 即 window
obj1.fn4()() //this取决于父作用域fn4 即obj1 1
obj1.fn4().call(obj2) //返回箭头函数 不存在显示绑定 所以 1
obj1.fn4.call(obj2)() // 将箭头函数的父级作用域指向给了obj2 所以输出 2
深刻理解一下箭头函数的this:
// ES6
const obj = {
getArrow() {
return () => {
console.log(this === obj);//箭头函数没有自己的this
};
}
}
//上述代码转化为es5
var obj = {
getArrow: function getArrow() {
var _this = this;
return function () {
console.log(_this === obj);
};
}
}