以下属性绑定虽然是多此一举,但为什么给属性重新绑定自身对象,反而成了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);//10console.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);//10console.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)();

慕村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
添加回答
举报
0/150
提交
取消