call、apply、bind,改变this指向

        改变this指向的三种方法,一直是面试的经典问题,也是开发中的一个重点问题。本次文章来聊一下this的指向怎么使用call、apply、bind来改变。

  1. call ( 新的this指向,参数一,参数二...)   参数不必传

        demo1:不传参,改变this指向

   function changeThis() {
        console.log(this)
    }
    const obj={name:'猪八戒',sex:'male'};
    changeThis.call(); //不传参数默认指向window
    changeThis.call(window); //window
    changeThis.call(document);// #document
    changeThis.call(obj); //{name: '猪八戒', sex: 'male'}

        demo2:传参,改变this指向

   var Dog={
        say:'wangwnagwang...,我吃',
        eat:function(food){
            console.log(this.say+food)
        }
    }
    Dog.eat('骨头'); //wangwnagwang...,我吃骨头

    var Cat={
        say:'miaomiaomiao...,我吃',
        eat:function(food){
            console.log(this.say+food)
        }
    }
    Cat.eat('鱼'); //miaomiaomiao...,我吃鱼
    // 使用call,这里将this指向了Dog
    Cat.eat.call(Dog,'鱼'); //wangwnagwang...,我吃鱼

2. apply ( 新的this指向, [参数一,参数二...])   参数可不传

call() 和 apply() 相似,不传参的时候用法一样

不同之处是:

call() 方法分别接受参数。

apply() 方法接受数组形式的参数。

如果要使用数组而不是参数列表,则 apply() 方法非常方便。

demo:

    var Person={
        likes:function(like3,like4){
            console.log(this.like1,this.like2,like3,like4)
        }
    }
    var  MiYang={
        like1:'黑木耳',
        like2:'银耳',
    }
    Person.likes.call(MiYang,'苹果','橘子')  //黑木耳 银耳 苹果 橘子
    Person.likes.apply(MiYang,['苹果','橘子'])  //黑木耳 银耳 苹果 橘子

情景题:快速找出一个数组里的最大值

    // 找出数组中的最大值 
    const array1=            
      [21,123,45,213,45,41,341,2,31,3,413,1,423,41,5341,3,41,341,12312,453,123,1];
    const maxNum= Math.max.apply(null,array1)
    console.log(maxNum)  //12312

3. bind:

bind与call和apply的区别:
bind的返回值是一个函数,需要自己去调用,而call和apply是立即调用。

demo1:

   var pig={
        name:'猪八戒'
    }
    function Animal(){
        console.log(this.name)
    }
    Animal.bind(pig)    // f Animal(){...}
    Animal.bind(pig)()  // '猪八戒'

demo2:

传参形式 

   function Animal(a,b,c){
        console.log(a,b,c)
    }
    // 正常调用
    Animal('dog','cat','pig')  //dog cat pig
    // 使用call改变this指向调用
    Animal.call(null,'dog','cat','pig')  //dog cat pig
    // 使用apply改变this指向调用
    Animal.apply(null,['dog','cat','pig'])  //dog cat pig
    // 使用bind改变this指向调用
    Animal.bind(null,'dog','cat','pig')()  // dog cat pig
    Animal.bind(null)('dog','cat','pig')  // dog cat pig

    // 这种情况下,
    // bind的第二个参数会作为Animal的第一个参数,
    // 执行方法的第一第二个参数会作为Animal的第二第三个参数
    Animal.bind(null,'cat')('dog','cat','pig')  // cat dog cat

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

liuwenjie_

感谢打赏,问题留言~

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

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

打赏作者

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

抵扣说明:

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

余额充值