call apply bind 替换this

替换this 的2种方式

将函数中不想要的this替换为自己想要的对象

何时:只要函数中的this不是想要的,都可替换为自己想要的指定对象

1. 在一次调用中,临时替换this为指定的对象

         (1). 实参值与形参值是一对一对应的时候

         函数.call(对象, 实参1, 实参2,…)

         //        |     ↓↓

         //函数(   ↓形参1, 形参2,…)

         // this->对象

         运行时:函数中的this,被临时替换为指定的对象,从第二参数开始才是给形参的实参值列表

         函数调用后,this和当前指定对象,再无关系。下次要用,再重新call()

         (2). 实参值都放在数组中整体给我们:

         用apply代替call

         var arr=[4000, 5000, 6000];

         函数.apply(对象, arr )

         //            |_ ____打散___  __|

         //             |↓|   |↓|   |↓|

         //   函数(    base,bonus1,bonus2)

         //            4000 + 5000 + 6000 =15000

         //        this->hmm

         运行时: 和call相同的是: 都是用第一个参数对象临时代替函数中的this。

             和call不同的是,apply会将数组参数打散为多个值,按顺序分别传给函数的多个形参。

      函数调用后,和call相同,this和当前指定对象,再无关系。

      问题:每次调用函数都要替换this,很繁琐。

2. 永久替换一个函数中的this为指定对象

         (1). 只绑定this:

         var新函数=原函数.bind(对象)

         原理: 创建一个和原函数一模一样的新函数副本,将新函数副本中的this永久绑定为指定对象.

         vs call/apply :call/apply 是立刻执行一次函数的意思

         结果: 调用新函数时,不用再重复传入替换this的对象。其中的this自动就是提前绑定的指定对象了。

         强调:被bind永久绑定的this,即使用call和apply也无法再替换了!

         典型场景: 回调函数中如果this不是想要的,必须用bind永久绑定。——因为回调函数被调用几次没准!

         (2).绑定this和部分参数值:

         var新函数=原函数.bind(对象, 参数值, …)

         原理: 创建一个和原函数一模一样的新函数副本,将新函数副本中的this永久绑定为指定对象。同时按顺序将部分形参值也永久绑定为固定的值。

         今后调用时: 无需再传入已绑定的实参值,只需要传入剩余的参数即可。

总结: 替换this:

1. 只在本次调用函数时,临时替换一次this,用call或apply

如果实参值列表是多个值分别给的,就用call调用

如果实参值列表是放在一个数组中整体给的,就用apply代替call

   apply只比call多了打散数组的功能

2. 希望永久绑定一个函数中的this并反复调用时,用bind()创建新函数副本,并永久绑定this。

如有不足之处请指正!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值