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

js 中多次bind的效果为什么会是这样?

js 中多次bind的效果为什么会是这样?

慕婉清6462132 2019-05-25 14:51:19
"usestrict";vara=function(){console.log("a")if(this){this()}}varb=function(){console.log("b")if(this){this()}}varc=function(){console.log("c")if(this){this()}}vard=a.bind(b)vare=d.bind(c)d()e()这段代码为什么执行结果是abab不能理解。。。"usestrict";vara=function(){console.log("a")lett=eval("this")if(this){this()t()}}varb=function(){console.log("b")lett=eval("this")if(this){this()t()}}varc=function(){console.log("c")lett=eval("this")if(this){this()t()}}varx=function(){console.log("a")lett=eval("this")if(b){b()t()}}vard=a.bind(b)vare=d.bind(c)varf=x.bind(c)e()f()就是这个“相当于”不理解啊,上面这个例子,是abbabc啊,说明第一次bind和并没有替换内部逻辑,纯粹就是第二次bind没有改变this的指向。
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

把bbind到a上时,d就相当于
d=function(){
console.log("a")
if(b){
b()
}
}
所以d再bind谁都没影响
                            
查看完整回答
反对 回复 2019-05-25
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

d=a.bind(b);
d();
这里d()的意思是将a的this绑定到b,然后执行。因此执行输出肯定是a,b。因此a中的this()实际上就等于b().但是当b中运行时,this的类型就已经是不是function了,因此运行肯定是会报错的。
e=d.bind(c);
e();
同样的道理,这里会首先执行d函数,然后执行c函数,但是在执行d的时候this就已经是undefined了,肯定就不会继续向下执行了,因此也就仅仅只执行了d函数,输出了a,b。
修改代码如下:
"usestrict";
vara=function(){
console.log("a")
console.log('a:',typeofthis);
if(typeofthis=='function'){
this()
}
}
varb=function(){
console.log("b")
console.log('b:',typeofthis);
if(typeofthis=='function'){
this()
}
}
varc=function(){
console.log("c")
console.log('c:',typeofthis);
if(typeofthis=='function'){
this()
}
}
vard=a.bind(b)
vare=d.bind(c)
d()
e()
你可以更加直观的查看到this的变化与输出结果的对比。
a
a:function
b
b:undefined
a
a:function
b
b:undefined
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 722 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信