解决方案 »

  1.   

    代码1中,getname的值为
    function(){
        return this.name;
    }
    针对object调用此方法时,this指向object。代码2中,getname的值为
    function(){
    return function(){
    return this.name;
    }
    }
    在全局范围调用object.getname()后,返回:
    function(){
    return this.name;
    }
    此时在全局范围再执行此函数,this指向全局对象(window)。
    代码3中,在定义getname的时候,此函数被立即执行:
    function(){
    var that=this;
    return function(){
    return that.name;
    }
    }
    因为执行换当前为全局环境,所以that指向window。代码4中,调用object2.getname()时,下面的函数被执行:
    function(){
    var that=this;
    return function(){
    return that.name;
    }
    }
    执行环境为object2,所以that指向了object2。
      

  2.   

    要分清,函数的调用者,和拥有者。函数的调用者才是this的指代者,而不是拥有者。再者,在js里'{}'也就是所谓的大括号并不产生新的作用域,只有function,也就是函数才能产生新的作用域。
      

  3.   

    (1)第一段:var name="window";
        var object = {
            name:"me",
            getname:(function(){
                return function(){
                    return this.name;
                }
            })()
        };
        //getname后面的自执行在执行完毕返回一个函数后才会给getname赋值(也就是把返回的函数赋
        //给getname),这样整个obj才完成声明。所以,这里的object完全等价于:
        var object = {
            name:"me",
            getname:function(){
                return this.name;
            }
        };
    (2)第三段:var name="window";
        var object1 = {
            name:"me",
            getname:(function(){//标记一下:外层函数
                var that=this;
                return function(){//标一下:内层函数
                    return that.name;
                }
            })()
        };
        //同上,getname后面的那一串并不是getname最终的值,在自执行完毕后,obj1实际上是:
        var object1 = {
            name:"me",
            getname:function(){
                    return that.name;
                }
        };
        alert(object1.getname());    //window还有一点需要明白外层函数并不是object1的getname的属性值(它只是一个用来返回“getname真正值”的一个函数而已),所以它的this指向的window(在这里指的是全局对象,不是name的值--字符串“window”),当然that也会指向window内层函数。显然内层函数引用着外层函数中的that,所以最终return的是window.name即:字符串“window”.(3)第四段:var name2="window";
        var object2 = {
            name:"me",
            getname:function(){//外层函数
                var that=this;
                return function(){
                    return that.name;
                }
            }
        };
        //这里的getname的值就不和上面一样需要再计算了,因为它后面不是表达式,而是一个函数类型的值,这
        //个函数(也就是外层函数)就是getname指向的值
        alert(object2.getname()());   //me既然外层函数是object2的一个属性值,那么它的this就指向object2,所以that也指向object2,当然它返回的函数因为引用着that  自然会返回object.name即“me”。