this指向(举例说明)

相信小伙伴都已经大概理解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.注意箭头函数需要看其是否有上层作用域

以上是本人在学习过程中的理解,虽然与官方理解相差很多,但大概原理是这样吧,每个人都有一套自己的理解,希望各位可以指出其中理解不对的地方,我也渴望进步!谢谢哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值