Closed raoenhui closed 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。
这里面有两个点:
(0, b.c)
可以分解为:
0, b.c
根据逗号操作符返回最后一个值 b.c
执行的值,类似于 var x = b.c;
中 x
值x
x
,引用 x
的是 window
,this
指向与 b.c
直接调用的作用域已经变更this.a
也就是 window.a
,返回 1
原来是this的作用域变了,懂了,谢谢了
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