查了网上一些资料,对闭包似懂非懂,下面例子为何这样输出,请大侠指导,谢谢!var name = "The Window";  var object = {
    name : "My Object",    getNameFunc : function(){
      return function(){
        return this.name;
      };    }  };  alert(object.getNameFunc()());输入"The Window",为什么不是"My Object"?

解决方案 »

  1.   

    alert(object.getNameFunc()());---->展开一看就明白了var f=object.getNameFunc();
    var v=f();//f(){return this.name} 这里的this是默认的window
    alert(v);
      

  2.   


    var name = "The Window";
      var object = {
        name : "My Object",
        getNameFunc : function(){
    var that = this;//这里的this才是object对象的引用
          return function(){
            return that.name;
          };
        }
      };
      alert(object.getNameFunc()());
    你是对this绑定不理解,去看看 javascript语言精粹
      

  3.   


    this的上下文为什么是window,不是object呢?谢谢!
      

  4.   

    你要想象JS的运行环境是这样的
    window={
        我们的代码。
    }
      

  5.   

    就是说,function(){
            return this.name;
          };
    这个是window调用的,并不是object调用的
      

  6.   

    http://blog.csdn.net/luwenhe/archive/2009/12/11/4985960.aspx
      

  7.   

    我也 一直没搞懂到底this是谁
      

  8.   


    根据结果我也知道这里的this是window,但不知道为什么是window,能否结合作用域链的调用顺序给解释下?谢谢!
      

  9.   


    返回的匿名函数并不是object对象的方法,
    调用的该函数只属于函数调用模式而不是方法调用模式,
    函数中的this当然是指向全局变量window
      

  10.   

    你这个问题,既不是闭包,也不是scope chain的问题,关于二者请看我的教程。
    http://iamduyu.cn/?p=308这个问题的关键是对this的理解,this并不是函数定义时决定的,而是函数被调用的时候决定的。this的本意是,“我这个函数作为哪个对象的方法被调用,那么函数体内this就是指这个对象,如果没有作为任何对象的方法来调用,则指window”。我们看到,虽然你的函数好像被层层对象“包围”,但是实际调用它的时候:alert(object.getNameFunc()());
    它并不是任何对象的方法,那么this就是指window。
    如果:
    var object2={};
    object2.memberFunc=object.getNameFunc();
    alert(object2.memberFunc());
    那么,由于函数被挂靠在object2下,则这时this指object2.