如何改变this指向?

如何改变this指向?

在接触this指向问题,相信很多同学都面临this指向的问题,有些时候我们在对象方法内部使用this。而并不想让this指向当前本对象,这时候该怎么办呢?答案就是改变this指向,该如何改变this指向呢,请往下看。

①call()在调用时改变this指向

var x = 2;
    var obj = {
        x:1,
        say:function(a){
            var sum = this.x+a
            console.log(sum);
        }
    }
    obj.say.call(window,2); //4

在上一篇博客写到常用的三种this指向问题,this是在对象方法内部的,所以this应该是指向obj,然后在下面调用的时候使用了一个call方法,将this指向改变到了window,也就是全局。所以当调用say方法会打印外部的x,也就是2。我们又在调用时向函数内部传入了一个参数,所以函数内部的this.x就是2传入一个2所以sum的值就是4

call()方法的具体用法

call()方法是在调用时改变this指向,括号内部的第一个参数是要指向的对象,第二个参数是调用函数的实参,如果有多个参数就依次在后面传入。

②apply()调用时改变this指向

  var x = 2;
    var obj = {
        x:1,
        say:function(a){
            var sum = this.x+a
            console.log(sum);
        }
    }
    obj.say.apply(window,[2]);//4

上面已经说了call和apply传参方式不同,apply给函数传参是以一个集合的形式传入,如果是多个参数,就在集合内部依次写入

③bind()定义时改变this指向

   var x = 2;
    var obj = {
        x:1,
        say:function(a){
            var sum = this.x+a;
            console.log(sum);
        }
    }
    var obj2 = obj.say.bind(obj);
    obj2(0);//1

bind()和call()传参方式相同,但是何时改变this指向不同。bind()方法是在定义时改变this指向。如上代码所示,定义obj2的时候将obj里的say的方法赋给给了obj2,此时obj2就是一个函数。因为暴露在全局,所以obj2的this是指向window也就是2.我们要让obj2也指向obj。就在赋值的时候bind一下,此时在调用obj2。打印结果就是1 指向了obj。

总结

①改变this指向常用的三个方法:call(),apply(),bind();要注意谁是在调用时改变this指向,谁是在定义时改变this指向
②就是参数问题,apply第二个参数就以一个集合形式传入,而call和apply都是依次传入。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值