替换this:
有时函数中的this不是我们想要的
1.临时调用一次函数,并临时替换一次this为指定的该对象
要调用的函数.call,替换this的对象其余实参值列表
原理:
call调用的意思,意为立刻调用函数执行一次
调用时,call()的第一个实参值对象进入要调用的函数内替换this
除第一个实参值对象以外,其他剩余实参值会依次传给要调用的函数的形参变量
function jisuan(base,a1,a1){
console.log(`${this.ename}的总工资是${a1+a2}`);
}
var lilei={ename:'lilei'};
var hmm={ename:'hmm'};
jisuan.call(lilei,100,200,300);
2.原函数有多个形参变量,要求分别传入多个实参值,但是多个实参值却是放在数组中给的,用apply代替call
要调用的函数.apply(替换this的对象,保存多个实参值的数组)
原理:
1.apply:使用.应用的意思,意为立刻调用函数执行一次
2.调用时:3件事
a.apply()的第一个实参值对象进入要调用的函数内替换this
b.先把第二个实参值数组扩散为多个实参值
c.再将从数组中打散出来的多个实参值,依次传给要调用的函数的形参变量
3.每次调用函数都要替换this,且每次调用时有部分实参值还是相同的
解决:为对象买一个专属的函数副本,并永久绑定this和部分实参值
var 函数副本=原函数.bind(替换this对象,部分固定的实参值)
原理:
a.不是调用函数,而是创建一个和原函数一模一样的函数副本
b.新的函数副本中的this被永久的替换为bind()第一个实参值对象
c.永久替换函数副本中第一个形参变量的值为bind()中第二个实参值
总结:
替换this共有3种选择:
1.在一次调用函数时,临时替换一次this:首选call
2.在一次调用函数时,需要多个实参值,但是多个实参值却是放在一个数组中保存的,需要打散数组并替换this,apply
3.反复使用一个函数,并永久替换this时,用bind()创建函数副本
function jisuan(base,a1,a2,a3){
console.log(`${this.ename}的总工资是${a1+a2+a3}`);
}
var lilei={ename:'lilei'};
var jisuan2=jisuan.bind(lilei,1000);
jisuan2(2000,3000,4000);