var name = "The Window";

var object = {

name : "My Object",

getNameFunc : function(){

return function(){

return this.name;

};

}

};

alert(object.getNameFunc()());

什么是闭包?

闭包并不是什么新奇的概念,它早在高级语言开始发展的年代就产生了。闭包(Closure)是词法闭包(Lexical Closure)的简称。对闭包的具体定义有很多种说法,这些说法大体可以分为两类:一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭包是在其词法上下文中引用了自由变量(注1)的函数。

另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义:在实现深约束(注2)时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。

这两种定义在某种意义上是对立的,一个认为闭包是函数,另一个认为闭包是函数和引用环境组成的整体。虽然有些咬文嚼字,但可以肯定第二种说法更确切。闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。所谓引用环境是指在程序执行中的某个点所有处于活跃状态的约束所组成的集合。其中的约束是指一个变量的名字和其所代表的对象之间的联系。那么为什么要把引用环境与函数组合起来呢?这主要是因为在支持嵌套作用域的语言中,有时不能简单直接地确定函数的引用环境。这样的语言一般具有这样的特性:函数是一阶值(First-class value),即函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值。

函数可以嵌套定义,即在一个函数内部可以定义另一个函数。

1&2:闭包是用来描述那个函数能够访问那个变量的这种能力的。而不是那个函数也不是那个变量。也就是一个函数能访问其词法范围之外的变量的能力。

3:永久保存在内存?只是将对象的生命延长到和使用它的函数一致。如果所有使用它的函数都被回收了,这个变量也就回收了。(好吧,在实践中,这属于钻牛角尖了,而且还要看JS引擎如何实现)

闭包在JS中的作用:

隐藏私有变量

将额外参数传递给运行时生成的函数 (因为你生成的函数会被别人调用,比如回调函数,毫无疑问函数的参数个数和次序已定,但你的函数确实需要更多信息)

需要注意的问题:

一个变量进入闭包后,会被复制到堆中,所有对该变量的使用都解析为引用这个堆中的变量。所以,使用这个变量的所有函数都会读取到最新的值,而不是你创建该函数时的值。

其实 专业一点的JS书中都有解释。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

python 阮一峰_阮一峰关于 Javascript 中闭包的解读是否正确?相关推荐

  1. python 阮一峰_阮一峰:前端框架 React 及 CSS in JS

    作者: 阮一峰 1. 以前,网页开发有一个原则,叫做"关注点分离"(separation of concerns). 它的意思是,各种技术只负责自己的领域,不要混合在一起,形成耦合 ...

  2. python字符串单个替换_如何用变量替换列表中的单个字符串?

    我正在编写一个脚本,用python为程序maya创建一个命名约定. 我将使用它来命名脚本创建的所有对象.在 例如,以左膝关节为例.脚本会传递这样的信息 ("bind"," ...

  3. python json提取器_【编号0004】爬虫中常用到的数据提取手段

    使用爬虫抓取网上公开的网页数据时,经常需要使用各种技能去解析到手的响应. 本篇文章,重点介绍下,数据提取时,有哪些常见的方法 0. 背景交代 编程语言:Python 提取方式:Python库 1. X ...

  4. python 回归去掉共线性_一文讲解机器学习算法中的共线性问题

    多重共线性是使用线性回归算法时经常要面对的一个问题.在其他算法中,例如决策树和贝叶斯,前者的建模过程是逐步递进,每次拆分只有一个变量参与,这种建模机制含有抗多重共线性干扰的功能:后者干脆假定变量之间是 ...

  5. mac python安装太慢_【已解决】Mac中给pip3添加代理以提升下载python包的速度

    折腾: [未解决]Mac中Python 3.7安装TensorFlow 期间,用:pip3 install tensorflow 期间会去从下载python包 此处连接 files.pythonhos ...

  6. python docx 替换文字_查找并替换.docx文件中的文本 - Python

    我一直在寻找一种方法来查找和替换docx文件中的文本而运气不佳 . 我已经尝试过docx模块而无法使用它 . 最后,我使用zipfile模块计算了下面描述的方法,并替换了docx存档中的documen ...

  7. [转载] python实现语义分割_使用Keras实现深度学习中的一些语义分割模型

    参考链接: Keras中的深度学习-数据预处理 Keras-Sematic-Segmentation 使用Keras实现深度学习中的一些语义分割模型. 配置 tensorflow 1.13.1+ten ...

  8. python 绘图英文字体_如何在matplotlib和networkx中显示非英语字体?

    这是这个question的后续问题.因为它解决了一个更一般的问题,所以我把它作为一个新的问题.在 我有一个网络,其中节点的标签是波斯语(阿拉伯语字母表).当我试图使用networkx来显示我的网络时, ...

  9. python实现excel搜索_从几百个Excel中查找数据,用Python一分钟搞定

    今天给大家分享一个真实的办公自动化需求,日常办公肯定都会遇到的,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大! 一.需求说明 首先我们来看下今天的需求,有一份档案记录总表的Ex ...

  10. python读excel乱码_解决Python2.7读写文件中的中文乱码问题

    Python2.7对于中文编码的问题处理的并不好,这几天在爬数据的时候经常会遇到中文的编码问题.但是本人对编码原理不了解,也没时间深究其中的原理.在此仅从应用的角度做一下总结, 1.设置默认编码 在P ...

最新文章

  1. C# 8.0的三个令人兴奋的新特性
  2. python3.6在线编译器-CPython 解释器 与 VC 编译器版本对应关系
  3. 关于数学里的一些知识
  4. (chap6 Http首部) 请求首部字段 If-Modified-SinceIf-None-Match If-RangeIf-Unmidified-Since
  5. windows编程,消息函数中拦截消息的问题
  6. MongoDB优越性
  7. leetcode - 967. 连续差相同的数字(集合、递归、动态规划)
  8. OpenGL纹理-12.5、纹理坐标
  9. 【数据结构】----将一个链表拆分为两个链表
  10. 三子棋游戏(C语言实现)
  11. 万里汇WorldFirst个人和公司帐户注册教程(送$25+0.3%提现费)
  12. ROS机器人语音模块
  13. GSON处理URL转码
  14. 利用函数求字符串长度
  15. 获取微信公众号文章内容
  16. 去掉电影字幕的最好方法
  17. 从底层源码认知Arraylist
  18. BZOJ 3270: 博物馆 1778: 驱逐猪猡 【概率DP+高斯消元】
  19. Kafka 的 Java 消费者如何管理 TCP 连接?
  20. 论文研究 | 机器视觉在无人机领域的发展

热门文章

  1. ios应用不通过应用商店下载
  2. keepalived 中关于 weight 和 preempt_delay 的实验
  3. python竖线_6.1. re模块搜索时要注意竖线|的使用
  4. android homme2016款,#攻势来袭#Android Homme 2016 x DEAL线下预定全面开启
  5. 外滩画报:揭秘全球电子垃圾坟墓
  6. 网页如何更改为黑白效果
  7. [生存志] 第136节 相如辞赋神来之笔
  8. Flutter pageview indicator指示器实现
  9. RAID磁盘列阵介绍
  10. indesign在python中是什么意思_用Python做深度学习一:数学基础帖子详情 - 网易云课堂...