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

萌新求教!先bind再apply的结果怎么回事哈啊?

萌新求教!先bind再apply的结果怎么回事哈啊?

万千封印 2019-11-03 09:55:30
constobj={s:'s1',getS(){console.log(this.s);}}consto={s:'s2'}letf=obj.getS.bind(obj);f.apply(o);//s1查了网上说bind多次绑定只有第一次是有效的,原理解析什么的没看懂。上面这段代码是先bind绑定,然后使用apply改变this的指向,按我这样理解的话,应该是输出s2。但是正确结果却是s1,是不是跟“bind的多次绑定只有第一次是有效的”有关?有没有哪位大佬能给我解析一下为什么会是这个结果。
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

bind的作用是生成一个新函数,且永久的改变该函数的this指向。用apply和call可以模拟bind,简单实现如下
functionbind(fn,scope){
returnfunction_bindFn(){
fn.apply(scope,arguments)
}
}
所以你的函数f就是下面的函数
function_bindFn(){
obj.getS.apply(scope,arguments)
}
这里的scope已经因为闭包的关系永久的定性为obj了。
当我们再对f进行bind的时候,就相当于生成了一个新函数
functionbind1(){
(function_bindFn(){
obj.getS.apply(scope,arguments)
}).apply(scope1,arguments)
}
bind1运行的时候,scope1改变了_bindFn中的this,但是_bindFn中的this是无效的,因为最终运行的是受scope影响的obj.getS。这就是bind嵌套发生的过程,无论嵌套多少次,最终运行的都是obj.getS.apply(scope,arguments)
理解了上面的,那么f.apply(o)为什么输出s1就简单了。
                            
查看完整回答
反对 回复 2019-11-03
  • 3 回答
  • 0 关注
  • 531 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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