个人对bind方法的一点理解,说的比较详细,希望和我一样的初学者能看懂
Function.prototype.Bind = function(index){
var that = this;
alert(that);//我们如果输出就发现是调用bind的函数对象
var arg = Array.prototype.slice.call(arguments,1)
return function(){
var arg1 = Array.prototype.slice.call(arguments);
that.apply(index,arg.concat(arg1))
}
}
//下面是一个例子
var obj = { value: []};
var a = function(){ console.log(arguments)
for( var i = 0; i < arguments.length; i++ ){
this.value.push(arguments[i]);
}
return this.value;
}.Bind( obj,4,5,6 ); //这里把参数4,5,6一起传入绑定给了函数a,但是这里并不会执行a中的语句,要在下面调用a才能得到结果
console.log(a());
index就是我们要绑定的参数,设置一个this指针为that,为的是指向调用bind方法的函数对象
var arg = Array.prototype.slice.call(arguments,1)//这里体现的是bind的预设参数功能,我们在绑定函数的时候可以传入多个参数,这里从第二个开始取,因为第一个参数是我们绑定的对象,后面是预设值的参数,但是还不会调用。
return function(){//我们这里返回的是一个函数,这也是为什么bind只是绑定但是还没有调用方法,而call和apply则是会直接调用方法
var arg1 = Array.prototype.slice.call(arguments);//这里的arguments是我们在绑定之后再去调用已经绑定好的函数时传入的参数
that.apply(index,arg.concat(arg1))//that就是调用bind方法的函数对象,我们将上面预设参数和调用函数时传入的参数拼接起来形成真正传入的参数