js闭包问题?这两段代码分别输出什么?为什么?

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

var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()());
阅读 1.7k
3 个回答
  1. 第一个输出The Window,谁调用这个函数this就指向谁,object.getNameFunc()()先执行object.getNameFunc()完这个后,再执行后面的函数,这时候this指向window
  2. 第二个输出My Object,闭包就是能够读取其他函数内部变量的函数,闭包最大一个特点就是能够保存变量,第二种写法实际上就是个闭包,that指向object,在object.getNameFunc()执行完后,that还是保存着对object的引用,所以 第二个输出My Object

仅是个人理解哈~

闭包里面return function返回的this指向window,而getNameFunc : function内部的this指向的是自身。所以得到这个结果。

this指向:函数中的this指向调用它的对象
第一段:object.getNameFunc()()就是:

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

此时this指向window,因此是The Window
第二段:这个是闭包加this指向

getNameFunc : function(){
  var that = this;
  return function(){
       //此处的that 在object.getNameFunc()执行后存在闭包引用;that指向object 
    return that.name;
  };
}

因此是My Object

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