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

对象属性绑定自己对象无效?

对象属性绑定自己对象无效?

呼如林 2019-05-23 11:28:59
以下属性绑定虽然是多此一举,但为什么给属性重新绑定自身对象,反而成了window?varobj={con:functionfn(x){console.log(x);//10console.log(this);//window}.bind(obj)}obj.con(10);
查看完整描述

2 回答

?
慕丝7291255

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

这个问题其实牵涉的比较多,先说var的问题,题主的代码相当于:
1、代码执行前就会做var声明提升,且初始值为undefined,所以题主代码相当于:
varobj;
obj={
con:functionfn(x){
console.log(x);//10
console.log(this);//window
}.bind(obj)
}
obj.con(10);
2、赋值的执行顺序问题:
A=B;//整个表达式返回B
但是完整意义上是这样的:
计算表达式A,得到一个引用refA;
计算表达式B,得到一个值valueB;
将valueB赋给refA指向的名称绑定;
返回valueB。
所以题主的代码:
varobj;
obj={
con:functionfn(x){
console.log(x);//10
console.log(this);//window
}.bind(obj)
}
obj.con(10);
在进行到bind(obj)这里的时候,obj还是undefined,直到上述赋值完成,obj才指向那个对象,所以题主bind(obj)等价于bind(undefined);
这个赋值的顺序问题,也解释了,你用let的时候,报错objisnotdefined的原因;
3、在thisArgu的位置传入了undefined,this通常会指向谁呢?这个测试下就知道了,印象里浏览器端非严格模式大多是window,严格模式大多是undefined,测试代码:
(function(){
console.log(this);//window
}).bind(undefined)();
(function(){
'usestrict'
console.log(this);//undefined
}).bind(undefined)();
                            
查看完整回答
反对 回复 2019-05-23
?
慕村225694

TA贡献1880条经验 获得超4个赞

因为你绑定的就是undefined,1var有声明的提升作用,换为let或者const直接报错2在es3环境下this=undefined=>windowvarobj={
con:(function(){
returnfunctionfn(x){
console.log(x);
console.log(this);
};
console.log(obj);//undefined
})()
}你的代码和这个一样的效果varobj={
con:functionfn(x){
console.log(x);
console.log(this);
}
}
obj.con=obj.con.bind(undefined);//将undefined换为obj就ok
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 347 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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