example:

var generateClosure = function(){

  var count = 0;

  var get = function(){

    count++;

    return count;

  };

  return get;

};

var counter = generateClosure();

console.log(counter()); //输出1

console.log(counter()); //输出2

console.log(counter()); //输出3

这段代码中,generateClosure()函数中有一个局部变量count,初值为0。还有一个叫做get的函数,get将其父作用域,也就是generateClosure()函数中的count变量增加1,并返回count的值。generateClosure()的返回值是get函数。在外部我们通过counter变量调用了generateClosure()函数并获取了它的返回值,也就是get函数,接下来反复调用几次counter(),我们发现每次的值都递增了1。

让我们看看上面的例子有什么特点,按照通常命令式编程思维的理解,count是generateClosure()函数内部的变量,它的生命周期就是generateClosure()被调用的时期,当generateClosure()从调用栈中返回时,count变量申请的空间也就被释放。问题是,在generateClosure()调用结束后,counter()却引用了“已经释放了的”count变量,而且非但没有出错,反而每次调用counter()时还修改并返回了count。这是怎么回事呢?

这正是所谓闭包的特性。当一个函数返回它内部定义的一个函数时,就产生了一个闭包,闭包不但包括被返回的函数,还包括这个函数的定义环境。上面例子中,当函数generateClosure()的内部函数get被一个外部变量counter引用时,counter和generateClosure()的局部变量就是一个闭包。

example:

var generateClosure = function{

  var count = 0;

  var get = function(){

    count++;

    return count;

  };

  return get;

};

var counter1 = generateClosure();

var counter2 = generateClosure();

console.log(counter1()); //输出1

console.log(counter2()); //输出1

console.log(counter1()); //输出2

console.log(counter1()); //输出3

console.log(counter2()); //输出2

转载于:https://www.cnblogs.com/tanghulu/p/7755270.html

【web前端】JavaScript闭包相关推荐

  1. Web前端-JavaScript基础教程上

    Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...

  2. Web前端JavaScript笔记(4)节点

    如何获取元素节点的属性: 在Web前端JavaScript笔记(3)对象中,介绍了访问行间属性的方法,除此之外,系统还提供了三个方法访问元素的属性: 1. setAttribute: 2. getAt ...

  3. Web前端-JavaScript基础教程下

    Web前端-JavaScript基础教程下 <script>有6个属性: async对外部脚本有效,可以用来异步操作,下载东西,不妨碍其他操作. charset为src属性指定字符集. d ...

  4. web前端JavaScript嵌入百度地图API的方法 最详细

    web前端JavaScript嵌入百度地图API最详细的方法 一.申请成为百度开发者,获得使用地图API接口的权限,获取(AK)码. 二.实现首图效果(可以参考开发者指南) 1. 根据Hello Wo ...

  5. Web前端Javascript笔记(6)正则表达式

    在web前端中,假设用户需要提交表单,在表单提交到服务器进一步处理之前,Javascript程序会检查表单,以确认用户输入的信息是符合规范要求的.这些工作可以使用正则表达式完成,正则表达式是一个描述字 ...

  6. web前端JavaScript程序员必学技术指南

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  7. Web前端——JavaScript(bom文档对象模型)

    >window对象 是bom的顶层对象,其中包含document对象: Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML ...

  8. Web前端Javascript笔记(8)Ajax前后端交互

    认识Ajax 全名Asynchronous Javascript and XML(异步JavaScript和XML),节省用户操作时间,提高用户体验,减少数据请求,传输获取数据.Ajax相当于前后台数 ...

  9. Web前端Javascript笔记(5)事件

    1. 什么是事件:事件是指发生并得到处理的操作 JavaScript中的事件是由访问web页面的用户引起的一系列操作,例如,用户的点击操作,JavaScript中有两种事件模型:内联模型,脚本模型. ...

  10. Web前端 Javascript笔记(1)数组

    结构 :html构建 样式:css控制 行为:JavaScript实现 什么是JavaScript? JavaScript是一种跨平台的脚本语言,平台,即运行环境,一般指操作系统. --------- ...

最新文章

  1. CSR稀疏矩阵存储方式
  2. 『第12天』从ipc$ 连接失败讲起
  3. 《博德之门 3》究竟有多「DnD」?
  4. linux 设置中文版man手册
  5. warning modified in the future
  6. 利用 Flash 远程检测客户端安装的杀软
  7. Azure 命令行工具大混战,都是什么,该选哪个?
  8. PPC WM5 输入法屏蔽插件
  9. canvas绘制验证码
  10. 二级C语言选择题分类,全国计算机等级考试二级C语言填空与选择题简单分类.doc...
  11. MapXtreme实用技巧
  12. layui上传多张图片
  13. 南航计算机院招聘,2018南航计算机专硕我考上啦!
  14. 监督学习之分类学习:线性分类器
  15. android ui组件 推荐,GitHub - zzti/XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!...
  16. 【Python】《Python网络爬虫权威指南》第三章任务:验证六度分隔理论
  17. Xcode中蓝色和黄色文件夹的区别
  18. MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据
  19. 录制动画时AnimationClip.SetCurve的relativePath问题
  20. Qt软键盘使用和修改软键盘参数 支持中文

热门文章

  1. 剑指 Offer II 092. 翻转字符
  2. 传统梯度下降法面临的挑战
  3. 第三章CDMA的原理与应用(2)
  4. 安卓的起源是linux么,最后的起源安卓版下载-最后的起源下载v2.1.9-Linux公社
  5. OpenCV-Python教程(7、Laplacian算子)
  6. MapReduce输出结果到多个文件
  7. 凸优化学习笔记(五):凸优化算法、无约束优化算法、有约束优化算法
  8. λ^n |λI−AB|= λ^m |λI−BA|
  9. 原生php phpmailer 发送邮件 email
  10. 2-机器学习入门-读书笔记