apply()和call()以及bind()
apply()和call()以及bind()三者都是用来改变上下文执行,只是传递的参数不一样
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)apply是将args数组一个一个与Function类中的参数一一对应
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表,Function类的参数一一对应
Function.bind(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表,Function类的参数一一对应
bind()并不会立即执行函数,而是返回一个绑定了this
的新函数,且新函数的this
无法再次被修改,需要手动调用新产生的函数
示例.ts
add(a, b) { return this + a + b; }
mutilAdd() { var param1 = 3; var param2 = 4; //将add中的上下文this变成了1 var res1 = this.add.call(1, param1, param2)//res1结果为8 var res2 = this.add.apply(1, [param1, param2])//res2结果为8
var fuc = this.add.apply(1, [param1, param2])//fuc为一个新的函数
var res3 = fuc();//结果为8
}
示例.js
function ProA(name, skill) { this.name = name; this.skill = skill; this.fn = function () { console.log("my name is " + this.name + ", my skills are " + this.skill); console.log(this) } } function ProB(name, skill) { console.log(this) //此处改动产生的效果为: //在ProB内,通过apply,执行,并改动ProA中的执行上下文(this), //及修改ProA的参数为ProB所接收的参数 //那么在new调用ProB时,相当于调用了被修改了执行上下文和参数之后的ProA //ProB的this传入ProA后执行this相关的参数函数赋值,由于ProA中的this是ProB的所以ProB就拥有了参数name、skill和函数fn ProA.call(this, name, skill) } var A = new ProA("AAA", "sing"); A.fn(); //my name is AAA, my skills are sing var B = new ProB("BBB", "dance"); B.fn();
参考:代码