第三和第四个不知道原理啊,有没js大神

 var a = 20;
    var foo = {
        a: 40,
        bar: function () {
            var a = 10;
            return this.a; //>=20
        }
    };

    console.log(
        foo.bar(),             // 40
        (foo.bar)(),           // 40
        (foo.bar = foo.bar)(), // 20
        (foo.bar, foo.bar)(),  // 20
        (foo.bar.apply(window)), // 20
        (foo.bar.apply(foo))// 40
        );

经过赋值,运算符运算后,都是纯粹的函数,不是对象方法的引用。所以函数指向的this都是windows的

a:40 类似于 var a=40

bar:function(){} 类似天 var bar = function(){}

js中的json. 一种轻量级数据格式.
json中的值是map形式的就是
key->value. 具体看下边的示例;

var person = { // 用 大括号括声明一个json.
"name":"lz" //key是name, value是lz;
};
//这个时候你可以这样使用它
alert(person.name);
//-----------如果你试了一下代码,到这里你应该明白它是什么格式了..
//------a:function(){} 中 a是key,function() 是 value
var person2 = {
"name":"lz", //有多个 key,value 用,号分开.
"say" : function(){
alert('hello word!');
}
}
person2.say();

/ *
其中 say:function(){alert('hello word!')}; 类似于
var say = function(){
alert('hello word!');
};

*/

如danielinbiti说的,你的函数经过运算返回后执行,会导致this对象指向window,而不是foo本身

(foo.bar = foo.bar)(), // 20
相当于重新给foo.bar定义,即

foo.bar = function () {
    var a = 10;
    return this.a; //>=20
}

因为这个时候foo.bar是在window作用域下而不是foo = {}这一块级作用域,所以这里的this指代的是window,this.a即相同域的var a = 20;

(foo.bar, foo.bar)(), // 20
相当于(function () {var a = 10;return this.a;}, function () {var a = 10;return this.a;})();同理,这个时候这两个函数的作用域都是window,this.a即相同域的var a = 20;
逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。
虽然有两个foo.bar,但是他们相互独立,没有影响,所以这个逗号表达式的值就是最后一个foo.bar的值,也就是这个表达式的值和第二个是一样的。

关于逗号运算符,参考JS逗号运算符的用法详解(转)