javascript - js 闭包问题
巴扎黑
巴扎黑 2017-04-11 12:24:01
[JavaScript讨论组]
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()());

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

巴扎黑
巴扎黑

全部回复(7)
怪我咯
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();
PHP中文网

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

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

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

javascript的四种函数调用模式

怪我咯

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

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

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

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

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

黄舟

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

阿神

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号