bind函数是Function.prototype里的一个函数,我们试着重写他,看一下他的原理。只是简单化的实现,
bind函数的作用是给函数绑定一个对象,然后返回一个新的函数,但是这个函数没有prototype属性(这里并没有实现这个功能)。
其实bind的大致原理就是利用闭包把一些信息(例如需要绑定的对象和传入的函数参数等)保存在内存中,然后返回一个新的函数,新的函数调用时使用的信息是之前调用bind函数时保存的一些信息(上下文对象和参数等),和apply其实有些相似,但是bind还可以先传入一个参数。具体区别,有待深入研究。下面通过代码看一下bind的简单实现。
function fun(x,y){alert(x+y);alert(this.i)}
function bind(){
var ob=this;//保存当前调用的对象
var arg=Array.prototype.slice.call(arguments,1);//提取参数,bind返回的新函数的参数可以先被赋值。例如fun函数的x可以在bind调用时就产生赋值(利用闭包保存),然后在调用返回的新函数时再赋其他的值
var fn=arguments[0];//保存返回的新函数调用时的上下文对象
return function(){
ob.apply(fn,Array.prototype.concat(Array.prototype.slice.call(arguments),arg));
//返回的新函数
}
}
fun.bind(a,1)(2)