var x = 30
var temp = {
x: 50,
foo: function () {
var x = 10
console.log(this.x)
}
}
//第一种情况
(temp.foo,temp.foo)() // 输出?
//第二种情况
temp.foo() //输出?
解析第一种情况
(temp.foo,temp.foo)() 是逗号表达式,从左到右执行,右边的赋值 相当于
(function () {
var x = 10
console.log(this.x)
})()
这里this指向window
详细解析
从逗号表达式、匿名函数的角度扫盲:
例子
let a = 2;
let b = 3;
let c = 0;
c =(a++,b++,a+b);
console.log(c); //输入7
匿名函数
匿名函数顾名思义指的是没有名字的函数
(temp.foo,temp.foo)() 相当于一个匿名函数
从左到右执行,
先执行逗号左边的temp.foo,这就是一个取了对象里面的方法,并没有执行,所以没有什么用;
再执行逗号右边的temp.foo,整个表达式返回的也是这个,所以最终返回的是,temp.foo(),
temp.foo是:
function () {
var x = 10
console.log(this.x)
}
temp.foo() 是:执行这个匿名函数
(function () {
var x = 10
console.log(this.x)
}) ()
所以this指向的是 window,this.x 取的就是全局变量x,因此返回30,而不是局部作用域里面的10。
//答案
//所以第一种情况
(temp.foo,temp.foo)() // 输出30
解析第二种情况
this指向问题
temp.foo() 直接调用temp对象中的foo函数 当前this指向temp对象 {x:50,foo:f()} 就找到了x:50
//答案
//所以 第二种情况 temp.foo() //输出 50