1.首先看一段代码:

var a = 1;

function fn1(){

  var b = 2;

  function fn2(){

    console.log(a);

    console.log(b);

  }

}

fn1();

我们在var b =2;这句代码打上断点,在chrome浏览器中进行调试,可以看到fn2这个函数对象有一个[[Scopes]]数组对象,里面有一个 Closure 对象,里面存放b: undefine这样一个值,也就是说保存了b变量,由于变量提升这时候还没有给b赋值,所以是undefined。这个Closure 对象就可以将其叫做fn2的闭包。

产生闭包的条件:1.闭包是在函数对象上面2.在函数定义的时候产生(不是调用的时候)3.函数是定义在另外一个函数的内部4.函数中的代码有引用外部函数定义的数据(函数/变量)

注:在上面的例子中fn2中引用了a,b变量,可以看作是通过作用域链向上找到的a,b变量,但是b变量会包含在fn2的闭包中,a变量不会,因为只是第一层外部函数并且不包括全局变量

2.上面的例子理解了闭包是什么,下面看一下闭包的一些用处

function fn1(){

  var b = 2;

  function fn2(){

    b++;

    console.log(b);

  }

  return fn2;

}

var fn3 = fn1();

fn3();

fn3();

上面的代码将一个包含闭包的内部函数fn2作为返回值返回了回来,这样我们就可以在外面操作fn2函数。按道理说fn1函数已经执行完毕了,应该将其作用上下文销毁,b变量应该已经访问不到了。但是由于fn2还未被销毁,因为外部有指向该函数的变量fn3,fn2中的闭包又包含了b变量,所以b变量得以延迟销毁。

上面的代码执行了两次fn3,即b++语句执行了两次。而代码运行的结果是:3 4 。说明两次执行fn3的时候操作的是用一个b变量,应为操作的b变量都是fn3的闭包上面的同一个变量。

另一个作用是,按道理在函数的外部应该是访问不到函数内部的数据的(变量/函数),但是通过这种闭包的方式我们就可以在外部访问到内部的数据了。

总的来说闭包的作用:1.延长了函数内变量的销毁时间2.使外部操作函数内部的数据成为可能

最新文章

  1. hdu 1878
  2. Debian-based Linux distributions 安装 virtualbox
  3. 清除SQL2008R2日志文件
  4. Unity3D中以任意格式获取时间(C# .net也可用)
  5. InstallShield 打包时需要注意
  6. 推荐图书-《SQL Server 2008商业智能完美解决方案》
  7. C语言---字符
  8. 玩转Android之在线视频播放控件Vitamio的使用
  9. [Python]round四舍五入精度缺失的解决
  10. iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变
  11. typeof操作符 返回值
  12. java设计模式---备忘录模式
  13. Linux下安装 Python3
  14. 大数据之hiveSQL
  15. 【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)
  16. openshift pod对外访问网络解析
  17. C# Http文件上传下载
  18. Spyder 调出绘图界面
  19. 20165207 Exp4 恶意代码分析
  20. Solr相似度算法一:DefaultSimilarity(基于TF-IDF的默认相似度算法)

热门文章

  1. CSS学习(3)样式表
  2. js的基本分类(0.1)
  3. LoadRunner通过火狐浏览器录制脚本后,进行回放时,回放脚本很慢
  4. Python实现一个桌面版的翻译工具【新手必学】
  5. 获取表格数据转换为JSON字符串
  6. HDU1276-士兵队列训练问题 (Queue)
  7. 极简的js点击组图切换效果
  8. drat笔记
  9. 《TCP/IP网络编程》读书笔记
  10. 安卓之线性布局LinearLayout