我们知道,

this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。《Javascript高级程序设计》

在下面的例子中,理解闭包中的this对象。

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

为什么最后的结果是"The Window"而不是object里面的name"My object"呢?

首先,要理解函数作为函数调用和函数作为方法调用。

我们把最后的一句拆成两个步骤执行:

var first = object.getNameFunc();
var second = first();

其中第一步,获得的first为返回的匿名函数,此时的getNameFunc()作为object的方法调用,如果在getNameFunc()中使用this,此时的this指向的是object对象。

第二部,调用first函数,可以很清楚的发现,此时调用first函数,first函数没有在对象中调用,因此是作为函数调用的,是在全局作用域下,因此first函数中的this指向的是window

再看下面这句话:

为什么匿名函数没有取得其包含作用域(外部作用域)的this对象呢?

每个函数被调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。  《Javascript高级程序设计》

那么,如何获得外部作用域中的this呢?

可以把外部作用域中的this保存在闭包可以访问到的变量里。如下:

var name = "The Window";
var object = {name: "My object",getNameFunc: function() {var that = this;   // 将getNameFunc()的this保存在that变量中var age = 15;return function() {return that.name;};}
}
alert(object.getNameFunc()());   // "My object"

其中,getNameFunc()执行时的活动对象有:that/age/匿名函数,在执行匿名函数时,同时引用了getNameFunc()中的活动对象,因此可以获取that和age的值。但是由于是在全局环境中调用的匿名函数,因此匿名函数内部的this还是指向window。

转载于:https://www.cnblogs.com/nuanriqingfeng/p/5789003.html

关于javascript闭包中的this对象相关推荐

  1. JavaScript处理中获取事件源对象

    第一种绑定方式(直接绑定到标签后面的事件)获取事件源的方法 这里的this就是指的是这个h2标签所以再控制台输出的时候会将整个控制台输出 如果然后通过传引用的方式将事件源对象传入到事件处理程序中:这里 ...

  2. 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

    文章目录 一.闭包中调用 Groovy 脚本中的方法 二.owner 与 delegate 区别 三.闭包中调用 Groovy 对象中的方法 一.闭包中调用 Groovy 脚本中的方法 在 Groov ...

  3. 面试官问我:什么是JavaScript闭包,我该如何回答

    闭包,有人说它是一种设计理念,有人说所有的函数都是闭包.到底什么是闭包?这个问题在面试是时候经常都会被问,很多小白一听就懵逼了,不知道如何回答好. 这个问题也有很多朋友在公众号给李老师留言了,问题表达 ...

  4. 面试官问我:什么是JavaScript闭包,我该如何回答?

    闭包,有人说它是一种设计理念,有人说所有的函数都是闭包.到底什么是闭包?这个问题在面试的时候经常都会被问,很多小白一听就懵逼了,不知道如何回答好. 这个问题也有很多朋友在公众号给李老师留言了,问题表达 ...

  5. 好程序员技术文档HTML5开发中的javascript闭包

    好程序员技术文档HTML5开发中的javascript闭包,事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格;更优雅,更简洁的表达出代码;在某些方面提升代码的执行效率,同时避免对命 ...

  6. 前端知乎:关于阮一峰博客《学习Javascript闭包》章节中最后两个思考题

    阮一峰博客:<学习Javascript闭包>章节中最后有个思考题: 如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了. 代码片段一 var name = "The ...

  7. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  8. Javascript基础与面向对象基础~第四讲 Javascript中的类对象

    今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...

  9. 详解Javascript中的Object对象

    本文地址:http://luopq.com/2016/02/28/Object-in-Javascript/,转载请注明 Object是在javascript中一个被我们经常使用的类型,而且JS中的所 ...

最新文章

  1. 开源实时日志分析ELK
  2. 深度学习的搜索应用Searching with Deep Learning
  3. linux安装教程6.3,CentOS 6.3安装教程(详细图解)
  4. [Luogu 1196] NOI2002 银河英雄传说
  5. 成功解决RuntimeError: Java is not installed, or the Java executable is not on system path
  6. 用python画渐变的圆_使用numpy绘制圆形渐变
  7. 复旦计算机转专业面试问题,转专业最容易的6所985大学,清华大学第4,复旦大学第3,这所第一...
  8. python设置window系统ip
  9. 利用计算机解决的生活问题,利用计算机解决经典动力学问题
  10. VS2022支持.net4.0和.net4.5SDK
  11. Linux电源管理-wakeup count
  12. ps4路由器虚拟服务器,在PC上使用PS4手柄图文教程(附模拟360手柄教程)
  13. 【FPGA+PWM】基于FPGA的三相PWM整流器移相触发电路的设计与实现
  14. 1336:【例3-1】找树根和child
  15. 组合数学+概率,期望+生成函数一文全精通
  16. Ant Design ProV5 Table columns定义valueType
  17. 为什么拼多多推广出价没人点击?新店铺怎么推广?
  18. 入职前的背景调查到底在查什么?
  19. Quantopian投资组合和绩效分析工具:Pyfolio
  20. Docute超简单的文档工具

热门文章

  1. 面试问了这两个问题,很多人的回答都自相矛盾
  2. 如何优雅地根治null值引起的Bug!
  3. Zuul上传文件,中文文件名乱码解决办法
  4. CVPR 2022|MPViT:用于密集预测的多路径视觉Transformer
  5. 虚数有物理意义:中科大潘建伟、南科大范靖云团队首次实验排除实数形式的标准量子力学...
  6. 周志华教授:关于深度学习的一点思考
  7. 炼个BERT别人花几分钟你花了快1天?谷歌:我这是4810亿参数的巨型BERT
  8. 14岁清华本科新生免试直博!高校新生大数据陆续曝光,男女比例、年龄差距各异......
  9. 老牌名校助理教授给出8个建议
  10. VS Code竟然能约会,找对象不看脸,看编程水平