替换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。
如有不足之处请指正!!!