为了账号安全,请及时绑定邮箱和手机立即绑定

javascript关于bind方法的实现

javascript关于bind方法的实现

米脂 2019-04-13 08:37:06
bind是ECMA5中才出现的方法,IE8等低版本浏览器并不支持,所以在MDN中有了这样的一段代码:if(!Function.prototype.bind){//如果低版本浏览器不支持bindFunction.prototype.bind=function(oThis){if(typeofthis!=="function"){//如果this不是一个函数,抛出错误//closestthingpossibletotheECMAScript5internalIsCallablefunctionthrownewTypeError("Function.prototype.bind-whatistryingtobeboundisnotcallable");}varaArgs=Array.prototype.slice.call(arguments,1),//arguments为bind()括号中的参数fToBind=this,fNOP=function(){},fBound=function(){returnfToBind.apply(thisinstanceoffNOP&&oThis?this:oThis||window,aArgs.concat(Array.prototype.slice.call(arguments)));//argument为bind返回方法运行时候的参数};fNOP.prototype=this.prototype;fBound.prototype=newfNOP();returnfBound;};}在理解的时候,加了一些注释。但是其他的一段代码不知道为什么(或者修补什么情况)存在:fNOP=function(){}//只是为了单纯复制this的原型链?thisinstanceoffNOP&&oThis?this:oThis||window//经测试,thisinstanceoffNO一直返回false,所以等价于oThis||window,那为什么存在?fNOP.prototype=this.prototype;//?fBound.prototype=newfNOP();//?按照我的理解,觉得以下代码也可以满足需要:if(!Function.prototype.bind){Function.prototype.bind=function(oThis){if(typeofthis!=="function"){thrownewTypeError("bindfunctionerror");}varaArgs=Array.prototype.slice.call(arguments,1),fToBind=this,fBound=function(){returnfToBind.apply(oThis||window,aArgs.concat(Array.prototype.slice.call(arguments)));};returnfBound;};}下面测试代码,好使:varobj={name:'name1',say:function(arg1,arg2){console.log(this.name,arg1,arg2)}}varfoo={name:'name2'}obj.say.bind(foo,'必定显示1','必定显示2')('没有位置不显示了1','没有位置不显示了2')//name2必定显示1必定显示2能给个比较清楚的解释吗?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 397 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号