var name = "The Window";var object = {
name : "My Object", getNameFunc : function(){
return function(){
return this.name;
}
}
}
alert(object.getNameFunc()());为什么会输出"The Window";
我以为是输出"My Object";因为return this.name返回给了return function(),而return function()又返回给了getNameFunc : function(),是这样理解吗?   getNameFunc : function()不是查找最近的同名变量吗?
还有object.getNameFunc()(),  这里有两个括号.去掉一个括号就输出function(){return this.name;} 这整个代码了.为什么会这样啊.?

解决方案 »

  1.   

    产生这种情况的原因就是,THIS作用域的变化!在getNameFunc函数里第一个this指向的确实就是object对象本身,但是在其内部继续return funtion(){内的时候,this就指向了全局window,下面我在getNameFunc函数里把object对象保存到that变量里,以变其内部的函数继续使用,这样输出的就上一"My Object"了,这些你可以自己验证!
    var name = "The Window";var object = {
            name : "My Object",        getNameFunc : function(){
           var that=this; //加这句是保存作用域对象,让其在函数内部继续使用!
                    return function(){
    //alert(this);//验证this,此时为全局对象window;
                            return that.name;  //等同于return window.name,自如就返回"The Window"
                    }
            }
    }
    alert(object.getNameFunc()());
      

  2.   

    问题在return function(){}的时候,是返回一个window下的新function。这样的话,对这个function来说,它最近的this就是window了.而window.name就是开始设置的var name = "The Window"。alert(object.getNameFunc()());
    因为object的getNameFunc()函数返回的是一个函数啊,就是那个return function(){},所以当然要给这个函数加上()让它执行,否则就显示这个函数的定义体了。SOSO
      

  3.   

    为什么在return function(){}的时候,就返回一个window下的新function
      

  4.   

           如果我告诉你,因为这是JAVASCRIPT的本身的运行机制导致,那你可能会问,为什么它是根据本身的机制来运行的呢?然后我又会告诉你,这是程序固有的,你也许会问,为什么这是它固有的呢?呵呵,有些东西你是要硬记的,比如2#说的,return funcion()返回的是一个可以直接在WINDOW下直接用的对象函数,导致当前环境作用域的改变,你只要知道这里就OK了。细节要研究下去,那就是研究编程机制了,研究机器码和普通代码转换的细节等等,那就不属于我们要研究的课题了!
      

  5.   

            var name = "The Window";

    var object = {
            name : "My Object",

            getNameFunc : function(){
                    return function(){
                            return this.name;
                    }
            }
    }

    var obj2 = {
          name : "旺财"
    }
    alert(object.getNameFunc()());
    alert(window.object.getNameFunc()());
    alert(object.getNameFunc().apply(obj2));1.调用window.object.getNameFunc()返回的function相当于独立在document中重新定义个function
    2.在前面条件成立下,document中的function会附着在window对象上,变成。window对象的一个属性
    3.function中有一个this关键字,它是跟着执行环境(对象)变化的,它会去寻找当前调用方法所关联调用对象是否有一个name属性我改良了一下,为了证明上面所说的:
    window.object.getNameFunc()()   :  相当于独立在document中重新定义个function
    object.getNameFunc().apply(obj2)   :  this跟着执行环境(对象)变化