猿问

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

以下属性绑定虽然是多此一举,但为什么给属性重新绑定自身对象,反而成了window?
varobj={
con:functionfn(x){
console.log(x);//10
console.log(this);//window
}.bind(obj)
}
obj.con(10);
呼如林
浏览 348回答 2
2回答

慕丝7291255

这个问题其实牵涉的比较多,先说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

因为你绑定的就是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
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答