关于原生js中bind函数的简单实现
今天继续研究了bind函数的实现,也知道了shim和polyfill的说法,现在总结一下,
if(!Function.prototype.bind){ Function.prototype.bind=function(oThis){ if(typeofthis!=="function"){ //closestthingpossibletotheECMAScript5internalIsCallablefunction thrownewTypeError("Function.prototype.bind-whatistryingtobeboundisnotcallable"); } varaArgs=Array.prototype.slice.call(arguments,1), fToBind=this, fNOP=function(){}, fBound=function(){ returnfToBind.apply(thisinstanceoffNOP&&oThis ?this :oThis||window, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype=this.prototype; fBound.prototype=newfNOP(); returnfBound; }; }
这是官方文档上的实现,我分二个方面来谈我要说的东西,
第一个是参数,agruments的使用
varaArgs=Array.prototype.slice.call(arguments,1),这里是将bind函数的参数数组取出来,第一个参数不要(就是不要oThis)也就是要被绑定方法的那个对象,第二个是
aArgs.concat(Array.prototype.slice.call(arguments)));这里是用了数组的方法,把参数插在参数数组后面,要注意,这个函数是要被return出去然后执行的,他的参数数组是return出去的那个fBound函数的参数数组,所以上下两个参数数组是不一样的,有点像柯里化。
第二个是上下文,在其中上下文的变化比较难理解,bind函数主要就是为了绑定上下文来使用的
fToBind=this这里是保存了对象的上下文,紧接着下面的apply方法让要被绑定的那个对象可以使用该上下文
fNOP.prototype=this.prototype;
fBound.prototype=newfNOP();
这里是以fNOP为中介把this.prototype这个原对象的属性给fBound,确保fBound是在定义的时候的那个上下文里面执行。本来
bound.prototype=self.prototype就可以将原属性集成过来了,但是这样两个对象属性都指向同一个地方,修改bound.prototype将会造成self.prototype也发生改变,这样并不是我们的本意。所以通过一个空函数nop做中转,能有效的防止这种情况的发生。
以上这篇关于原生js中bind函数的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。