先bind再apply的结果
const obj = {
s:'s1',
getS(){console.log(this.s);}
}
const o = {
s:'s2'
}
let f = obj.getS.bind(obj);
f.apply(o);//s1
查了网上说bind多次绑定只有第一次是有效的,原理解析什么的没看懂。
上面这段代码是先bind绑定,然后使用apply改变this的指向,按我这样理解的话,应该是输出s2。但是正确结果却是s1,是不是跟“bind的多次绑定只有第一次是有效的”有关?有没有哪位大佬能给我解析一下为什么会是这个结果。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
bind的作用是生成一个
新函数
,且永久的
改变该函数的this指向。用apply和call可以模拟bind,简单实现如下所以你的函数
f
就是下面的函数这里的scope已经因为闭包的关系永久的定性为obj了。
当我们再对
f
进行bind的时候,就相当于生成了一个新函数bind1运行的时候,scope1改变了_bindFn中的this,但是_bindFn中的this是无效的,因为最终运行的是受scope影响的obj.getS。这就是bind嵌套发生的过程,无论嵌套多少次,最终运行的都是
obj.getS.apply(scope, arguments)
理解了上面的,那么
f.apply(o)
为什么输出s1就简单了。以前也纠结过,改变
this
指向,这种说法非常不直观,可以理解为:以上相当于
bind
则是未执行版的apply/call
所以针对你的问题,其中
之后
getS
中的参数在bind
时就已经绑定好了,只是没有执行而已,推荐阅读关于JS中一些重要的api实现apply 改变的是
f
的 this 的指向。然后 f 会调用
getS
,这时会使用bind
的时候指定的obj
作为getS
的 this 。