关于闭包,如何理解?

哪位大神帮我解释一下下面的代码?
1
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());

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

阅读 2.3k
3 个回答

第一个alert:返回的函数里面返回this.name,因为后续没有引用,所以getNameFunc直接释放了,因此这里的this存在丢失问题,这时候直接指向了window,于是alert的是The Window
第二个alert:返回的函数里面返回that.name,但是这里的thatgetNameFunc有定义,因此getNameFunc就没有被释放,然后存在在作用域中,于是可以通过作用域链向上查找that,先找到的是object作用域,于是alert的是My Object

第二个alert体现的就是闭包的作用,能够保持作用域链的引用,可以在全局环境下访问到函数的内部作用域。

第一个alert:The Window
第二个alert:My Object

采纳答案里和我理解的不太一样
不是因为后续没有引用,所以getNameFunc直接释放吧
而是return function(){return this.name;}匿名函数没调用对象就指向global

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