Closures are functions that refer to independent (free) variables.

闭包是以静态方式/词法方式进行存储所有父作用域的一个函数

在JavaScript高级程序设计里面通过一个 createComparisonFunction() 函数和这个函数的作用域链之间的关系图说得很明白为什么闭包可以访问外部函数的变量, 是因为闭包的作用域链不仅包括自己本地的活动对象, 还包括外部函数作用域链所指向的活动对象.

在JavaScript高级程序设计, JavaScript精粹 都有一个类似的例子 在循环里创建闭包.

(为了测试, 做了一点点修改)

 1 var fn = function() {
 2     var result = [];
 3     for(var i = 0; i < 3; i++) {
 4         result[i] = function() {
 5             console.log(i);
 6         };
 7     }
 8     return result;
 9 };
10
11 var list = fn();
12 list[0]();   //3
13 list[1]();   //314 list[2]();   //3

 1 var fn = function() {
 2     var result = [];
 3     for(var i = 0; i < 3; i++) {
 4         result[i] = (function(num) {
 5             return function() {
 6                 console.log(num);
 7             };
 8         })(i);
 9     }
10     return result;
11 };
12
13 var list = fn();
14 list[0]();   //0
15 list[1]();   //1
16 list[2]();   //2

当时为了让自己可以了解得更彻底 自己也把作用域链画了出来 希望对部分同学有用

第一个函数作用域关系图:

从第一个函数的作用域关系图可以看出 之所以数组里的每个函数都打印3是因为每个函数在各自本地的活动对象里都找不到 i 所以继续往上找 在外部函数的活动对象里找到了i 但是此时的i 在循环结束后值为3 所以每个函数打印均为3

第二个函数作用域关系图:

第二个函数把一个立即执行的函数赋给了result数组, 并传入了i 所以此时result[x]的活动对象里就多一个变量num 值为 i (函数参数按值传递) 所以返回的函数打印num时 根据作用域链找到了result[x] 活动对象里的num 并打印出 num的值

通过画这两个函数的作用域链关系图, 就可以清楚地弄懂闭包的工作原理, 也就不会对闭包那么害怕啦!

PS. 上面两个例子在JSLint 里都是会报错的: Don’t make functions within a loop

所以大家在实际的程序当中就不要这样使用 可以在循环外变量定义函数后再在循环里使用

最后附上 sublime-text 3 怎么安装SublimeLinter 的教程 http://www.sublimelinter.com/en/latest/installation.html

如有错误 欢迎指正 : )

转载于:https://www.cnblogs.com/Lmovingon/p/4219568.html

JavaScript 小记 之 闭包(Closures)相关推荐

  1. [译]Javascript中的闭包(closures)

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  2. JavaScript小记(持续更新)

    注意:(2020.01.14) 后续将都在我的学习笔记文档 - JavaScript小记中进行更新,该文章不再更新,请持续关注上述网页 学习js遇到的疑问和js基础都记录在这里,持续更新中. 2019 ...

  3. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  4. 深入理解javascript原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...

  5. 深入理解javascript原型和闭包(17)——补this

    本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...

  6. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  7. 【进阶2-3期】JavaScript深入之闭包面试题解

    (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue.React.Node源码和实战.面试指导) 本周正式开始前端进阶的第二期,本周的主题是作用域闭包,今天是第8天. 本计划一共28期,每 ...

  8. 【javascript笔记】关于javascript中的闭包

    最开始看<javascript高级程序设计>的时候就看到了javascript中的闭包,在第七章第二节....好大概知道了,过了段时间,好了又忘了... 我们来看这本书里面关于闭包是怎么描 ...

  9. 解析面试常问题之JavaScript中的闭包概念及应用,顺便普及一下大家口中常说的内存泄漏问题

    JavaScript中的闭包是一个面试中经常被考到的问题,大家可能都对这个概念多多少少都有一些模糊的概念或者一点都不了解,那么今天就来给大家讲解一下. 公众号:前端印象 不定时有送书活动,记得关注~ ...

最新文章

  1. 谜题14:转义字符的溃败
  2. 如何查看linux系统源码
  3. Python模拟大整数乘法的小学竖式计算过程
  4. BZOJ 1486 最小圈(二分+判负环)
  5. 【网络信息安全】密码学入门笔记
  6. 自动滑动的banner图
  7. 三种div居中显示方式
  8. 关于安装TOMCAT解压版环境配置流程
  9. mysql安装配置jdbc_JDBC环境配置
  10. Windows 10 蓝牙管理页面“添加蓝牙或其他设备“选项点击无响应的解决方案
  11. 【Research】Accounting-会计
  12. Flutter+原生开发与H5+原生开发的区别在哪里?
  13. 《蔡康永的说话之道》思维导图学习笔记
  14. python身高体重程序代码_python EM算法4(身高体重数据集)
  15. Android/安卓 文本添加中划线、下划线的方法
  16. 计算时间差 html,计算时间差的公式
  17. jquery 遍历java对象,js/jquery遍历对象和数组的方法分析【forEach,map与each方法】...
  18. 特斯拉第二季度电动汽车销量下降近 18%
  19. maya如何查看资源大纲_maya大纲视图(Outliner),MAYA
  20. python scapy教程_scapy学习笔记

热门文章

  1. linux正则表达有话说
  2. 小工具查看MYSQL数据文件块和类型
  3. 第五章(5)Libgdx应用框架之线程
  4. linux下安装配置使用memcache,memcached,libevent(后有ubuntu的memcache安装)
  5. Share一个整理美化JavaScript代码的在线工具
  6. html相邻兄弟选择器,CSS CSS 相邻兄弟选择器 - 闪电教程JSRUN
  7. w10系统没有打开方式_小白怎么制作微软官方win10系统安装启动U盘
  8. 表示python代码块的是_编写高质量Python代码的59个有效方法,你用过几个
  9. html缩进快捷键_Mac技巧|如何高效使用苹果便笺?利用便笺快捷键快速完成操作!
  10. Go 语言编程 — Cobra 指令行工具