var x = 10;
var foo = {
x: 20,
bar: function () {
var x = 30;
return this.x;
}
};
console.log(
foo.bar(), // 20.
(foo.bar)(), // 20.
(foo.bar = foo.bar)(), // 10.
(foo.bar, foo.bar)() // 10.
);
这题考的主要知识点是同名变量覆盖和上下文
this
的问题。(foo.bar)()
这个是取得表达式foo.bar
的值,然后执行它,和foo.bar()
是一样的。(foo.bar = foo.bar)()
这个就有意思了,它是把foo.bar
赋给foo.bar
,感觉好像啥都没做是不是?但就是因为这个赋值语句,让bar
方法脱离了它原本的上下文foo
,变成了一个全局函数。因为JS中赋值语句是有副作用的,除了赋值,还会把这个值返回。实际上这句代码相当于:
这时候的
temp
指向foo.bar
,但此时的this
却不再是foo
,而是全局对象(window
)。因为全局变量相当于window
的属性,所以返回的是全局变量x
的值10
。(foo.bar, foo.bar)()
这个同理,逗号运算符会依次执行每个子表达式,并返回最右的那个子表达式的值。