var name = "The Window";   
  var object = {   
    name : "My Object",   
    getNameFunc : function(){   
      return function(){   
        return this.name;   
     };   
    }   
};   
alert(object.getNameFunc()()); //The Window最近刚刚研究js闭包  小弟不明白为什么结果是The Window 而不是My Object
name不是全局变量么? 外层的name不应该被object中的覆盖么?

解决方案 »

  1.   

    alert(object.getNameFunc()()); //The Window但是你执行这句话的执行作用域是在window下~·var name = 'the window'
    这个正好是全局变量所以弹出the window
      

  2.   

    你的return this.name;   
    在运行的时候this 是window对象.所以this.name,回去调用那个全局的name对象.
      

  3.   

    当在函数中访问一个变量的时候,搜索顺序是先搜索自身的活动对象(即return的function),如果存在则返回,如果不存在将继续作用域链上一个函数(即getNameFunc), 在return 的function作用域中是存在this.name的,即window.name,所以没有必要再向上一个作用域去找。
      

  4.   

    4楼的朋友 这个我试过了
    var name = "The Window";   
      var object = {   
        name : "My Object",   
        getNameFunc : function(){   
          return function(){   
            return name;   
         };   
        }   
    };   
    alert(object.getNameFunc()()); //The Window
    this去掉后还是‘The Window’ 好像你的这种解释不太对噢
     
    我是在学习js闭包时碰到的这个例子 上面说理解了这个就真正理解了js的闭包 js闭包小弟基本上懂了
     可是小弟愚昧 还是没有理解这个例子啊 苦恼
      

  5.   

    5楼的兄弟  多谢指点啊  貌似豁然开朗了 明白了 是因为作用域链的关系啊那怎么才能输出'My Object'呢
      

  6.   

    this去掉之后在return function的作用域和getNameFunc的作用域中都找不到name了,你试着写成这样:var name = "The Window";
        var object = {
            name: "My Object",
            getNameFunc: function () {
                var name = "test";
                return function () {
                    return name;
                };
            }
        };
        alert(object.getNameFunc()()); //The Window
      

  7.   

    “My Object"是object对象的属性,根本就不需要用闭包,object就是全局的,直接写return object.name就OK了
      

  8.   

      var object = {   
        name : "My Object",   
        getNameFunc : function(){   
          return function(){   
            return this.name;   
         };   
        }   
    };   
    alert(object.getNameFunc()()); // 我以为这个就可以输出‘My Object’了 结果测试是空啊 如果在这个作用域链getNameFunc ()找不到 不是应该继续往上找么?应该能找到object 中的name啊?
      

  9.   

    你要理解闭包是某个作用域内的局部变量在作用域结束后不会被GC回收,object的作用域是全局的,不会回收。一般闭包是为了函数保持一个函数内部变量的值。
      

  10.   

    9楼的大侠  恩  我知道 呵呵 我是说 如果这种形式不变 就是还是这样写 
           var object = {   
        name : "My Object",   
        getNameFunc : function(){   
          return function(){   
            return this.name;   
         };   
        }   
        };
           在return function 中也能取到object中的name属性么
      

  11.   

    function才是作用域, object={}不是作用域。第一个作用域this就是有的啊,就是window对象,所以不用在找了。
    你说的“如果在这个作用域链getNameFunc ()找不到”,是找什么找不到?this肯定是有的
      

  12.   


      var object = {   
        name : "My Object",   
        getNameFunc : function(){   
          return function(){   
            return this.object.name;   
         };   
        }   
      };
     
      

  13.   

    var name = "The Window";
      var object = {   
        name : "My Object",   
        getNameFunc : function(){             
          return function(){   
            return name;   
         };   
        }   
    };   
    alert(object.getNameFunc()()); //The Window
    大侠 怎么这样写 也会输出The Window 把this去掉之后 还是会找到 全局变量name么?
      

  14.   

    除非在return的function中或者在getNameFunc中找到name,否则肯定会找到全局的name,因为它会顺着作用域链向上找到的,如果前面都没有就会找到全局的了。