新读(2017年10月19日)

本文写于 2013年06月16日,今天做了一点修改,所谓修改,其实只是删去了几句不影响技术内容的话。关于闭包,我最近写了一篇新的文章,提到了静态作用域,相比本文,是对闭包的更深一层的解释,可以作为本文的后续阅读。至于本文,也不是已经没有阅读的价值,因为它说明了以下两点:

  1. 闭包是一个概念,JavaScript 编程中常常用到闭包,但仅仅学会使用闭包,并不等于知道闭包本身是什么;而本文,正是从概念本身解释闭包。
  2. 理解闭包与对象的关系,对于理解闭包非常有帮助,因为二者的功能有很大的重叠。

以下是旧文

关于什么是闭包,很多“高手”会给出一段“特权函数”访问外部作用域变量的 JavaScript 代码,并且告诉你,闭包就是局部变量在函数返回之后继续存在。那么,你如何理解“闭包是穷人的对象”、“对象是穷人的闭包”?

===========================================================

  • 以下内容根据《代码的未来》、“犀牛书”、以及《Thinking in Java》整理

===========================================================

什么是闭包?

闭包(Closure)这个词的意思是封闭,将外部作用域中的局部变量封闭起来的函数对象称为闭包。被封闭起来的变量与封闭它的函数对象有相同的生命周期。

什么是函数对象?

函数对象是作为对象来使用的函数,这里的对象是指编程语言操作的数据。

函数对象与闭包

函数对象不一定是闭包。

C 语言中,可以获取一个函数的指针,并通过指针间接调用此函数。这就是 C 语言中的对象(函数对象也是对象)。但 C 语言中的函数对象不是闭包——它不能访问外部作用域的局部变量。

JavaScript 中,每个函数都有一个与之相关联的作用域链。每次调用 JavaScript 函数的时候,都会为之创建一个新的对象用来保存局部变量,并把这个对象添加至作用域链中。当函数返回时,再将这个对象删除,此对象会被当做垃圾回收。但如果这个函数定义了嵌套的函数,并将它存储在某处的属性里,就意味着有了一个外部引用指向这个嵌套的函数。它就不会被当作垃圾回收,它所指向的变量绑定对象同样不会被回收。

由此可见,JavaScript 中的函数对象是闭包——可以把外部作用域的局部变量“封闭”起来。

什么是对象?

面向对象中的“对象”是指问题空间中的元素(猫、狗)及其在解空间中的表示(new Cat(); new Dog())。对象是过程(函数)与数据的结合。

对象与闭包

对象是在数据中以方法的形式内含了过程,闭包是在过程中以环境的形式内含了数据。所谓“闭包是穷人的对象”、“对象是穷人的闭包”,就是说使用其中的一种方式,就能实现另一种方式能够实现的功能。

应用场景

保护函数内的变量安全:如迭代器、生成器。
在内存中维持变量:如缓存数据、柯里化。

【旧文新读】解释“闭包”需要几行代码?相关推荐

  1. [旧文新读] 深度学习在Airbnb搜索的应用实践

    作者 | Mr.张@知乎 整理 | NewBeeNLP 这篇文章是airbnb团队在KDD2019上的一篇文章.在当时来看,GBDT的模型已经对他们的业务有了一定的贡献,这篇文章主要是在讲,该团队在尝 ...

  2. 老文新读 | 大数据于国内影视行业的意义及应用

    编者注:本文由作者4年前发表于知乎专栏,前两天编者偶然读到,觉得很有意思,于是转过来与大家分享.原文标题:评析:触不到的大数据 作者 | 王义之,凡影合伙人 最近这几年,我们可以听到很多关于大数据在影 ...

  3. 旧文新发之三----清明种种

    清明种种 2007年12月14日,国务院正式发布<关于更改〈全国年节及纪念日放假办法〉的决定>(第二次修订),规定自2008年1月1日起将清明.端午.中秋定为法定假日,清明.端午.中秋当日 ...

  4. 旧文新发之十----滨河大道《诗词联碑》序

    滨河大道<诗词联碑>序 杨森翔 吴忠得名,肇始于明代军屯:嘉靖六年,以其屯长姓名命名.2003年5月8日,一方大唐吕氏夫人墓志的出土,解开了一个千古之谜,成为"古灵州在吴忠&qu ...

  5. 旧文新发----真情与技巧的交响

    真情与技巧的交响 ­--读二熊诗词有感 杨森翔 今年"五一"前,接到诗词学会寄来的<寒塘韵语>,顺手翻开,便读到五言律绝<飞鸿><秋草>< ...

  6. 侵略伤痕(旧文新发)

    这篇文章是我中学时候几篇作品的集合,最初发表在红袖添香,不知道这些年她经历了什么,今天在自己的博客,再次将这个文章发出来.只为祭奠,那逝去的青春,那些错过的人.那时候的爱情那样简单,爱的遮遮掩掩,被爱 ...

  7. html中写一个占内存很大死循环代码,HTML5新特性Bug:这12行代码分分钟让你浏览器崩溃iPhone重启...

    使用这十二行JavaScript代码能让firefox.chrome.safari等众多浏览器崩溃,甚至让iPhone重启? 起因 今天刷推特的时候发现Cyber Security@cyber__se ...

  8. html使页面崩溃,HTML5新特性Bug:这12行代码分分钟让你浏览器崩溃iPhone重启

    使用这十二行JavaScript代码能让firefox.chrome.safari等众多浏览器崩溃,甚至让iPhone重启? 起因 今天刷推特的时候发现Cyber Security@cyber__se ...

  9. GitHub 热榜:天才黑客开源新项目,不到 1000 行代码,1400 Star!

    点击上方"Github爱好者社区",选择星标 回复"资料",获取小编整理的一份资料 来自机器之心 在深度学习时代,谷歌.Facebook.百度等科技巨头开源了多 ...

最新文章

  1. 在DataTable中创建计算列
  2. 青龙面板安装教程+手机京豆组件让你的手机美起来
  3. 关于mysql启动问题---mysqld_safe mysqld from pid file * ended
  4. js将数组元素随机排序的方法
  5. 脑动力:C语言函数速查效率手册(附DVD光盘1张) [平
  6. 禁止32位安装包运行在64位操作系统上
  7. 七牛云上传视频如何有效做到节省空间
  8. linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...
  9. 出租车管理系统java_基于jsp的出租车管理系统-JavaEE实现出租车管理系统 - java项目源码...
  10. 你以为PHP那么好自定义升级?
  11. HDU 5610 Baby Ming and Weight lifting
  12. 程序员数据库访问的优化的一些思考
  13. mysql数据库优化6_mysql数据库优化
  14. 【Python简明教程一】Python编程基础
  15. STARK论文记录(2021CVPR):Learning Spatio-Temporal Transformer for Visual Tracking
  16. 2019,推荐几个牛逼大佬的公号
  17. 阿里云上发布自己的网站的方法
  18. 113.输入10个国家的名字,按由小到大排序
  19. 打印网页时去掉标题、页码、网页地址方法
  20. 快速粘贴与自动填表软件V1.0 注册版

热门文章

  1. 了解机器学习回归的3种最常见的损失函数
  2. OpenCV对象检测实例
  3. Python五种常见的算法,你都了解么
  4. AI工程师面试知识点:神经网络相关
  5. SAP LSMW 导入物料主数据报错 - You have not fully maintained the descriptions - 之分析
  6. 行业观察 | 机器人Ameca挣脱「灵魂」枷锁觉醒?
  7. 诺奖得主本庶佑:CNS这些顶刊观点有九成不正确,不要盲从迷信,搞科研做到六个C更重要...
  8. 长达1500年之久的争论:意识是连续的还是离散的?心理物理学家给出了新的回答...
  9. 中科院脑科学与智能技术卓越创新中心:在“脑海”中突破进取
  10. 华为秘密作战计划曝光,重注研发AI芯片挑战英伟达,轮值董事长挂帅