吃透this指向问题

在this指向问题上我听说过一句话:谁调用它它就指向谁。

下面在不同的情况下看看这句话

一、全局环境中的this

function o1(){
        console.log(this);
    }

    function o2(){
        'use strict'
        console.log(this);
    }
    o1(); //window
    o2(); //undefined

在全局环境下,非严格模式下this指向window,而严格模式下this指向undefined。

 let o1 = {
        num: 2,
        fn: function(){
            console.log(this); //{num: 2, fn: ƒ}
            console.log(this.num); //2
        }
    }

    o1.fn()

通过上面代码段可以看出此时this指向o1,可以得出结论:如果函数中的this被上级对象调用,那么this指向的就是上一级对象,否则指向全局环境。

二、上下文对象调用中的this

 let student ={
        name:'xiaoming',
        fn: function(){
            return this.name
        }
    }
    
    student.fn() //'xiaoming'



let student ={
        name:'xiaoming',
        brother:{
            name:'danne',
            fn: function(){
                return this.name
            }
        }
       
    }
    
    student.brother.fn() //'danne'

结合上下两个代码段可以得出结论:this会指向最后调用它的对象。

三、通过call、apply、bind改变this指向

let o1 = {
        text:'o111',
        fn:function(){
            return this.text
        }
    }

    let o2 = {
        text:'o222',
    }

    console.log(o1.fn.call(o2)); //o222

call、apply、bind会改变相关函数的this指向,上面代码段通过call将this指向改变,指向o2。

四、构造函数中的this

//场景1
    function Foo(){
        this.user = "xiaoming";
        const o = {user:'xiaoliu'};
        return o ;
    }

    let instance = new Foo;
    console.log(instance.user); //xiaoliu

//场景2
    function Foo(){
        this.user = "xiaoming";
        return 1
    }

    let instance = new Foo;
    console.log(instance.user); //xiaoming

如果构造函数中显式返回一个值,返回的是一个对象(复杂类型)的话,this指向的就是这个返回的对象;如果返回的是一个基本类型,那么this还是指向实例。

五、箭头函数中的this指向

    let o = {
        fn:function(){
            setTimeout(function(){
                console.log(this);
            })
        }
    }
    console.log(o.fn()); //window

    let o = {
        fn:function(){
           setTimeout(()=>{
               console.log(this);
           })
        }
    }
    console.log(o.fn()); //{fn: ƒ}

代码段看出箭头函数指向了o,结论:在箭头函数中,this的指向是由外层(函数或全局)的作用域来决定的。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beannnnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值