在js高级程序设计中,有一个这样的例子:
(object.getName=object.getName)() //此时内部的this不是指向object而是window
书中原话是,这个赋值表达式的值是函数本身,所以this的值得不到维持。
个人猜想:然倒是因为赋值操作会断开引用?
向各位请教正确解答
在js高级程序设计中,有一个这样的例子:
(object.getName=object.getName)() //此时内部的this不是指向object而是window
书中原话是,这个赋值表达式的值是函数本身,所以this的值得不到维持。
个人猜想:然倒是因为赋值操作会断开引用?
向各位请教正确解答
因为前面那玩意是个表达式,书上已经说得很清楚了。赋值表达式的值等于右值(左值不是什么奇怪的setter
和getter
的话也会等于左值),也就是说,这个表达式的值等于object.getName
,对这个表达式求完值后已经和object
没有关系了,后面的调用相当于
const getName = object.getName
getName()
this
当然得不到维持了。
只要你的函数是求值求出来的,像(someObject.foo || someOtherObj.bar)()
或(someObj.foo, someOtherObject.bar)()
,都是会丢失对原this
的引用的。
8 回答6k 阅读✓ 已解决
9 回答9.4k 阅读
6 回答5.1k 阅读✓ 已解决
5 回答3.6k 阅读✓ 已解决
4 回答8k 阅读✓ 已解决
7 回答10k 阅读
5 回答7.3k 阅读✓ 已解决
不考虑
call、apply、bind
等特殊情况,正常情况下只有o.m()
这种方式会传递o
作为m
的this
。而例子中的赋值表达式乍一看跟这种形式很像,但是实际上并不是。整个表达式的结果是
getName
这个函数的引用,在表达式的求值结果中并没有object
。把这个代码改写一下,大概相当于下面这样:
(t=object.getName, object.getName=t, t)()
最终调用的是
t
这个函数引用,并没有object