zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ie支持function.bind()方法实现代码

方法代码 实现 支持 IE Function bind
2023-06-13 09:14:43 时间
前端开发者应该很清楚Javscript脚本的function函数对象可以通过call或apply方法,使其改变内部作用域(this)所指向的对象,实现更多可扩展的功能开发。ie原生支持function对象的call和apply方法,在firefox或其它浏览器下也得到支持,但是call和apply方法是立即作用并执行,例如:
复制代码代码如下:

varfunc=function(){
alert(this);
}.apply(window);

当脚本解析引擎执行到这段代码时,会立即弹出对话框并显示object字符串。我们的初衷是想定义func方法作用在window对象域上,并在后期调用时再执行,但是call和apply方法并不能满足我们的初衷,它们会立即得到执行。

在google一番技术资料后,发现firefox原生支持一个bind方法,该方法很好的满足了我们的初衷,调用方法与call和apply一样,只是定义完成后,在后期调用时该方法才会执行。但是这个bind方法只有在ie10版本的浏览器才得到原生支持,低于该版本的浏览器下执行时会得到一个undefined的错误提示。于是只好再次上网google解决方案,功夫不负有心人,我们在firefox的开发站找到了解决方案,那就是增加property原型使得所有浏览器都能支持bind方法,代码如下:
复制代码代码如下:

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,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype=this.prototype;
fBound.prototype=newfNOP();
returnfBound;
};
}

看懂这段代码需要点功底,我只是知道如何拿来用,如果哪位大牛有兴趣能够介绍一下这段源码的原理,不胜感激,谢谢!

单纯不是什么态度,而是一种满足。