不懂就问,关于函数赋值的问题

在js高级程序设计中,有一个这样的例子:

(object.getName=object.getName)()  //此时内部的this不是指向object而是window

书中原话是,这个赋值表达式的值是函数本身,所以this的值得不到维持。
个人猜想:然倒是因为赋值操作会断开引用?

向各位请教正确解答

阅读 2.4k
3 个回答

不考虑call、apply、bind等特殊情况,正常情况下只有o.m()这种方式会传递o作为mthis

而例子中的赋值表达式乍一看跟这种形式很像,但是实际上并不是。整个表达式的结果是getName这个函数的引用,在表达式的求值结果中并没有object

把这个代码改写一下,大概相当于下面这样:

(t=object.getName, object.getName=t, t)()

最终调用的是t这个函数引用,并没有object

这个和es规范有关,推荐看冴羽的博客链接,当中有很深入的认识。

因为前面那玩意是个表达式,书上已经说得很清楚了。赋值表达式的值等于右值(左值不是什么奇怪的settergetter的话也会等于左值),也就是说,这个表达式的值等于object.getName,对这个表达式求完值后已经和object没有关系了,后面的调用相当于

const getName = object.getName
getName()

this当然得不到维持了。

只要你的函数是求值求出来的,像(someObject.foo || someOtherObj.bar)()(someObj.foo, someOtherObject.bar)(),都是会丢失对原this的引用的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏