JS中一个闭包问题。不理解最后的输出结果。

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

此处的getNameFunc()是作为object对象的一个方法被调用的对吗?
如果是的话,那么this即被绑定到了object对象了的是吧?
那么为什么return this.name时,输出全局变量'The Window'而不是object中的name属性值'My Object'呢?

阅读 3k
3 个回答

这不应该算是闭包问题,而是this的指向问题……
每个函数(含嵌套函数)都有自己的this和arguments,内函数的this和arguments不等于外函数的this和arguments,这在犀牛书函数一章有讲,至于为什么没说……
内部函数引用外部的this,需要在外部函数中设置局部变量,如self=this,arguments相同……利用闭包,内部函数可以调用外部函数的变量而获取外部函数的调用对象this
内部函数的this就是全局变量window,在严格模式下好像是undefined

这个是this指向有问题了,这个this指向的是匿名函数返回值
改成

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

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

这是 js 设计的一个问题。this会查找到上一层函数作用域。在es5里, 如果未能在上一层作用域查找到,则会去全局作用域查找

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题