var out = 25,
inner = {
out: 20,
func: function () {
var out = 30;
return this.out;
}
};
console.log((inner.func, inner.func)());
console.log(inner.func());
console.log((inner.func)());
console.log((inner.func = inner.func)());
25,20,20,25
代码解析:这道题的考点分两个
1.作用域
2.运算符(赋值预算,逗号运算)
先看第一个输出:25,因为(inner.func, inner.func)是进行逗号运算符,逗号运算符就是 运算前面的,
返回最后一个,举个栗子
var i=0,j=1,k=2;
console.log((i++,j++,k))//返回的是k的值 2 ,如果写成k++的话 这里返回的就是 3
console.log(i);//1
console.log(j);//2
console.log(k);//2
回到原题(inner.func, inner.func)就是返回inner.func而inner.func只是一个匿名函数
function () {
var out = 30;
return this.out;
}
而且这个匿名函数是属于window的
则变成了
(function () {
var out = 30;
return this.out;
})()
此刻的this–》window
所以out 是25
第二和第三个console.log的作用域都是 foo,也就是他们执行的其实是
foo.func();
foo作用域中是有out变量的,所以结果是20
第四个console.log
考查的是一个等号运算inner.func = inner.func 其实返回的是运算的结果,
举个栗子
var a=2,b=3;
console.log(a=b)//输出的是3
所以inner.func = inner.func 返回的也是一个匿名函数
function () {
var out = 30;
return this.out;
}
此刻 道理就和第一个console.log一样了 输出的结果是 25