1.bind和call,apply一樣都是改變this指向的
原理是使用bind方法曹货,會將函數(shù)綁定到指定的對象上,這個(gè)時(shí)候函數(shù)體內(nèi)的this會被綁定到bind方法的第一個(gè)參數(shù)值上讳推,這個(gè)時(shí)候該函數(shù)體內(nèi)的this就會自然而然的指向第一個(gè)參數(shù)顶籽。而和call,apply的區(qū)別在于bind方法需要調(diào)用執(zhí)行。
function objj(){
console.log(this.s2);
}
var fn4 = {
s2 :3
}
var s2 = 4;
objj.bind(fn4)(); //3
1.bind的柯里化(Curry)
我理解的柯里化就是把接受多個(gè)參數(shù)的函數(shù)變?yōu)榻邮諉我粎?shù)银觅,并且返回接受剩下的參數(shù)并且返回結(jié)果的新函數(shù)礼饱。
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實(shí)現(xiàn)
Function.prototype.mybind =function(){
//保存this;
var slef = this;
//將參數(shù)第一個(gè)接取出來保存究驴,就是需要綁定的this;
var context = Array.prototype.shift.call(arguments);
//把剩余的參數(shù)轉(zhuǎn)變成數(shù)組
var arg = Array.prototype.slice.call(arguments);
return function(){
//返回一個(gè)新函數(shù)镊绪,
//將mybind剩余的參數(shù)數(shù)組和調(diào)用mybind所返回的函數(shù)在執(zhí)行的過程中接收的參數(shù)拼接起來,用apply方法改變this指向?yàn)閏ontext上。
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);