相信小伙伴都已经大概理解this指向了,现在我直接举例说明:
1.对象直接调用普通函数和箭头函数
首先举例对象引用函数(普通函数get和箭头函数post)
let obj={
name:'对象1',
//普通函数
get:function(){
console.log(this.name)
},
//箭头函数
post:()=>{
console.log(this.name)
}
}
let obj2={name:'对象2'}
//--------------普通函数调用----------------------
//正常调用函数
obj.get()//对象1 ------>对象引用普通函数
//call、apply、bind指向
obj.get.call(obj2)//对象2----->对象引用普通函数后,使用call改变了this,指向了对象b
//--------------箭头函数调用----------------------
obj.post()//undefined----->直接调用箭头函数,其this指向上层作用域的this
//但这里是因为箭头函数的优先级>new>call>对象>直接调用
//call引用
obj.post.call(obj2)//undefined--->因为箭头函数的优先级>new>call>对象>直接调用
这里直接理解:对象调用普通,可以改变this指向
对象调用箭头,不可改变this指向,因为他的this优先级最高
2.对象调用普通函数-----函数内返回一个普通函数
let a={
name:'对象1',
get:function(){
return function(){
console.log(this.name)
}
}
}
let b={name:'对象2'}
//引用函数
a.get()()//undefined---->返回一个函数,并独立使用---window
//call
a.get.call(b)()//undefined--->返回一个函数‘前’再来调用,依然理解直接使用一个普通函数
a.get().call(b)//对象2--->返回一个函数‘后’(这里相当于a.get()()),再来改变this指向
注意:要分清楚引用函数后--返回的函数是否开始调用了--调用了之后才可以改变this指向
3.对象调用普通函数-----函数内返回一个箭头函数
let a={
name:'对象1',
get:function(){
return ()=>{
console.log(this.name)
}
}
}
let b={name:'对象2'}
//引用函数
a.get()()//对象1----返回一个箭头函数,this指向上层作用域get函数
//而get函数的this被a对象绑定,所以指向的是'对象1'
a.get.call(b)()//对象2----返回之前改变了this指向,再调用箭头函数,那么指向了b对象
a.get().call(b)//对象1----返回之后才改变this指向,而箭头函数优先级大于call,所以没有改变
注意:返回的箭头函数---调用之前看上层作用域是否改变了就可以了
规律:
1.箭头函数>new>call>对象调用>直接使用函数(先看优先级)
2.再看这个函数是调用前,还是调用后才改变this指向
3.注意箭头函数需要看其是否有上层作用域
以上是本人在学习过程中的理解,虽然与官方理解相差很多,但大概原理是这样吧,每个人都有一套自己的理解,希望各位可以指出其中理解不对的地方,我也渴望进步!谢谢哈。