sofish / learn-js

老婆想学 js 这件事就是一个政治任务
142 stars 9 forks source link

(0, b.c)();为什么结果为1呢 #2

Closed raoenhui closed 8 years ago

fanlinchong commented 8 years ago

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Comma_Operator

由以上链接可知(0, b.c)()中第一个圆括号的意思是返回b.c这个表达式的值(即函数c的引用),因为返回的值没有变量来接收,所以默认使用window对象来作为接收者;第二个圆括号表示调用,而此时f是附加在window上的,所以f是被window调用的,所以this.a的值就是window.a

crimx commented 8 years ago

@fanlinchong

由以上链接可知(0, b.c)()中第一个圆括号的意思是返回b.c这个表达式的值(即函数c的引用),因为返回的值没有变量来接收,所以默认使用window对象来作为接收者;第二个圆括号表示调用,而此时f是附加在window上的,所以f是被window调用的,所以this.a的值就是window.a

不认同“因为返回的值没有变量来接收,所以默认使用window对象来作为接收者”,“而此时f是附加在window上的,所以f是被window调用的

哪怕有了变量接收, c 里面的 this 依然指向的 global 。

var d = (0, b.c);
d(); // 1 or undefined (strict)

这是因为返回的是 b.c 这个函数的引用,有没有变量接收都好,c 这个函数的 scope 依然挂在 b 上。但 (0, b.c)() 执行时的 context 是 global,所以 c 里面的 this 指向的才是 global。

sofish commented 8 years ago

这里面有两个点:

  1. 逗号运算符
  2. 括号运算符

(0, b.c) 可以分解为:

  1. 0, b.c 根据逗号操作符返回最后一个值 b.c 执行的值,类似于 var x = b.c;x
  2. Grouping Operator 这个括号,返回 x
  3. 执行 x,引用 x 的是 windowthis 指向与 b.c 直接调用的作用域已经变更
  4. 得当前作用域的 this.a 也就是 window.a,返回 1
raoenhui commented 8 years ago

原来是this的作用域变了,懂了,谢谢了