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()());

知道闭包是要在函数外部读取内部的变量,但是这个代码还是不咋理解啊= =

阅读 3.9k
8 个回答
var name = "The Window";//定义全局变量name,而在浏览器中,全局变量会自动成为window的属性.
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;//这里的this指向window,所以返回window.name
      };
    }
  };
  alert(object.getNameFunc()());

var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;//而这里用that保存了本对象this值
      };
    }
  };
  alert(object.getNameFunc()());
    //所以这两段代码对比是为了说明函数内的嵌套函数的this指向的是顶级变量window.

既然你提到了闭包,那你看看这段代码,自己先思考下,再运行,希望帮到你~

var oPerson = { name: 'john' };

(function(oTeacher) {
   window.getTeacher= function() {
      console.log(oTeacher);
   };
}(oPerson));

window.getTeacher();

oPerson.surname = 'doe';

window.getTeacher();

oPerson = { name: 'mary', surname: 'sullivan' };

window.getTeacher();

闭包中this指向的是全局作用域window对象。
前一个alert(object.getNameFunc()());显示全局变量“The Window”

后一个因为把外部函数this的指向赋给了that ,它指向的是object对象局部变量name属性,所以第二个返回的是“My Object”

我收藏的,可以看看,帮助理解https://segmentfault.com/a/11...

这是this的引用问题……和闭包有什么关系………

返回:The Window;
返回:My Object;
第一个this指向window,因为返回的函数的this是指向window的,所以是The Window;
第二个this指向object,that保存了this,所以that也是指向object的,所以that.name返回的是My Object;
PS:本人菜鸡,不知解释是否真确哈~

在方法调用模式中:
当一个函数保存为一个对象的属性时,这个函数是此对象的方法。此时,在方法中使用this指向的是当前这个对象
在函数调用模式中:
当一个函数并非作为一个对象的属性时,这个函数是全局函数。此时,在方法中使用this指向的是全局对象。

javascript的四种函数调用模式

《JavaScript语言精粹》中提到:this的值取决于调用的模式

  1. 方法调用模式:函数是对象的一个属性时,我们称它为一个方法。方法被调用时,this被绑定到该对象。

  2. 函数调用模式:当函数并非对象的属性时,它被当作一个函数来调用,this被绑定到全局对象。

  3. 构造器调用模式:在函数前面带上new来调用,this被绑定到新建的对象。

  4. apply(call)调用模式:this由传入参数决定。

个人总结,任意未被bind过的函数如果不直接以obj.的形式并且不以call、apply的方式调用,函数体里的this都是指向全局对象。不知道理解的对不对。不过能解决你这问题。

这道题是我的面试题。。。

推荐问题
宣传栏