JavaScript神奇的作用域

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

这段代

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

这段代码的运行结果是:

JavaScript就是这么一门神奇的语言,很多时候并不按常理出牌。

第一行是普通调用,返回this.x就是返回temp.x,所以输出40

第二行(temp.foo)()等同于temp.foo(),this的值得到了维持,返回this.x还是返回temp.x

第三个先执行了temp.foo=temp.foo这个赋值语句,然后再调用赋值后的结果。因为这个复制表达式的值是函数本身,所以this的值不能得到维持,就会返回全局值为20的x

第四行由于逗号运算符导致两边运行环境不一样,右边会变成全局环境,故又是返回20

第五行和第六行都是强行指定运行环境,所以输出也不出人意料。