逗号表达式。

题目

var x = 20;
var temp = {
    x: 40,
    foo: function() {
        var x = 10;
        console.log(this.x);
    }
};
(temp.foo, temp.foo)();

答案

20

解析

因为使用了逗号表达式,所以会依次对括号里的项进行计算,然后返回最后一项计算后的值。那么经过计算后返回的是一个新的函数,与temp 和 foo 都无关了。这个函数直属于window,所以 this.x 指向的是20;

拓展

如果将题目修改一下:

var x = 20;
var temp = {
    x: 40,
    foo: function() {
        var x = 10;
        console.log(this.x);
    }
};
(temp.foo)();

此时没有逗号表达式,就不会先计算,然后再返回,而是直接返回。

当中的 (temp.foo)(); 等同于 temp.foo(); ,所以结果是40.