刚刚登陆微博,想看下有什么八卦新闻,突然看到@JS小组 分享的一道题:
@JS小组 是由资深前端工程师维护的一个小微博,既然由他们提出了这个问题,想必还是有点价值的,所以我也研究了下,觉得这个其实也不太难理解,主要牵涉到 逗号运算符 和 改变this 指向,下面分享下我的见解:
<!-- lang: js -->
foo.bar() // -> 20
/**
* 这个不用多说了吧,this指向foo,大家都懂的
*/
(foo.bar)() // -> 20
/**
* 这个我是这样理解的哈
* 括号里面没有运算符
* js执行时直接引用它的指向
* 相当于foo.bar()
* js进入foo对象内执行,属于指向型执行
*/
(foo.bar = foo.bar)() // ->10
/**
* 这个实际上是执行foo.bar = foo.bar的返回值
* 而它的返回值是什么?
* 就是foo.bar的function
* 把function写出来就是以下代码,this指向window
* 这个我把它记为返回值执行
*/
(function(){ var x = 30; return this.x })();
(foo.bar, foo.bar)() // -> 10
/**
* 逗号运算符,运算过后也返回foo.bar指向的function
* 这个也属于返回值执行
*/
小小挫见,好像有点勉强,对于底层的原理理解不深。欢迎大神们指教!