1.bind和call,apply一样都是改变this指向的
原理是使用bind方法,会将函数绑定到指定的对象上,这个时候函数体内的this会被绑定到bind方法的第一个参数值上,这个时候该函数体内的this就会自然而然的指向第一个参数。而和call,apply的区别在于bind方法需要调用执行。
function objj(){
console.log(this.s2);
}
var fn4 = {
s2 :3
}
var s2 = 4;
objj.bind(fn4)(); //3
1.bind的柯里化(Curry)
我理解的柯里化就是把接受多个参数的函数变为接收单一参数,并且返回接受剩下的参数并且返回结果的新函数。
function Add(b,c){
console.log(b+c);
}
var bat = Add.bind(null,1);
bat(2);//3
function fns(a,b){
return this.f+a+b;
}
var bas = fns.bind({f:2},3);
console.log(bas(4));//9
bind实现
Function.prototype.mybind =function(){
//保存this;
var slef = this;
//将参数第一个接取出来保存,就是需要绑定的this;
var context = Array.prototype.shift.call(arguments);
//把剩余的参数转变成数组
var arg = Array.prototype.slice.call(arguments);
return function(){
//返回一个新函数,
//将mybind剩余的参数数组和调用mybind所返回的函数在执行的过程中接收的参数拼接起来,用apply方法改变this指向为context上。
slef.apply(context,Array.prototype.concat.apply(arg,Array.prototype.slice.call(arguments)));
}
}
function fff(m,f,g){
console.log(this.a+""+m+""+f+""+g);
}
var sss2 = {
a:1
}
fff.mybind(sss2,1,2)(3);