首页 > 其他分享 >闭包的理解

闭包的理解

时间:2023-06-08 16:23:35浏览次数:43  
标签:闭包 运算 对于 闭合 理解 变量 函数

看到知乎的一个回答,觉得非常不错,抄下来备份记录

引用自知乎用户回答:

 

作者:赵者也
链接:https://www.zhihu.com/question/21865351/answer/2142927643
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

简单。

闭包编程语言的一种功能,为了解决这么一个问题:

如果函数传入的不是全局变量,而是一个生命周期比这个函数还短的局部变量,怎么保证这个函数正常运行完。

一般的做法就是随着这个函数一起保存一个副本嘛。当然各个语言都有自己的做法。还有的语言根本就不支持闭包,函数运行着的时候,变量没有了,销毁了。那就报错呗

-------------------看上面就够了,下面是一些私货,可看可不看---------------

扩展一下:闭包的概念来自抽象代数,指的是能让一个运算闭合的集合。我们编程定义的函数,也是一种运算,如果变量来自外部,那这个运算对于这个函数的环境来说是不闭合的,因为除了函数的环境,还依赖变量的环境。所以我们要在函数的运行的时候,保证运算是闭合的,不管是通过复制变量副本,还是操作指针,还是别的什么办法,这一系列操作,就是闭包。

 

 

再次扩展一下:关于闭合

闭合这个数学概念我觉得很妙。定义不难理解:

封闭性,即闭包(数学)数学中,若对某个集合的成员进行一种运算,生成的仍然是这个集合的成员,则该集合被称为在这个运算下闭合

举个简单的例子,减法对于正整数是不闭合的,除法对于整数是不闭合的,开根号对于有理数是不闭合的。如果计算不闭合,就会出现bug,譬如整数的除法出现小数。对于人类来说,这种bug可能会开辟全新的数学领域(人类数学就是这么发展的),但是对于计算机来说,就是报错、死机。

闭包的概念,不仅仅是用于保证每一个函数能够顺利运行,还可以被用于计算机语言设计。譬如c#语言的设计就是闭合思维的典范。C#的类库设计对于低级的、初级的功能闭合,用c#实现较为简单的功能基本学一两个小时就可以做出不错的程序。但如果想用到高级的功能,就必须突破这层闭合,学习使用成本都较高,减少了新手犯错的几率,又保留了高手的自由度。再譬如,c++指针为何难用,就是因为指针的运算规则完全游离于程序规则,在任何情况下都提供了不闭合的可能性。所以出bug不要太容易。

 

 

此外,吐槽一下。编程中的闭包是给面向对象擦屁股的。因为对于值传递的编程语言(c语言之类的)根本不存在计算不封闭的问题,变量传递都是内存直接复制。

根源上,图灵机式的顺序编程对于值传递来说是闭合的,但是对于大量的引用传递其实一开始就是不闭合的。所以只要有引用类型的语言,必须要给这种不闭合擦屁股,想办法处理变量和函数生命周期不一致的问题。这是面向对象的原罪。

标签:闭包,运算,对于,闭合,理解,变量,函数
From: https://www.cnblogs.com/zmy2020/p/17466825.html

相关文章

  • AMBA4 AXI 相关理解(一)
    参考https://zhuanlan.zhihu.com/p/166419540https://zhuanlan.zhihu.com/p/447663561.AXI总线的三个分类AXI4:地址映射控制,大块数据读写。如DDR、BRAM数据搬移等。AXI-Lite:简单低吞吐量,如外设模块的配置,状态寄存器的读写。AXI-Stream:面向高速数据流传输,不涉及内存地......
  • 关于定位Position 和 overflow:hidden 的理解
    01.CSS中的position属性,用来设置元素质在页面中的位置;通过该属性的设置,可以将元素放在任意自己想要的位置;Static:默认值,设不设都是一个样;Relative:相对定位;这个相对是相对于自己来讲,可以当成影子来理解,真身不动,影子按需要跑;Absolute:绝对定位,相对......
  • MATLAB中的函数句柄 理解
    #MATLAB中的函数句柄理解https://zhuanlan.zhihu.com/p/266263265##1、何为函数句柄?函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。它的作用是将一个函数封装成一个变量,使其能够像其......
  • 深入理解注解驱动配置与XML配置的融合与区别
    摘要:本文旨在深入探讨Spring框架的注解驱动配置与XML配置,揭示两者之间的相似性与差异。本文分享自华为云社区《Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别》,作者:砖业洋__。本文旨在深入探讨Spring框架的注解驱动配置与XML配置,揭示两者之间的相似性与差异。......
  • SQL Server 补丁理解及安装 内附完整版下载地址及sp1/2/3补丁
    启动安装程序下载sqlserver2014,双击startup.exe进行安装 系统配置检查器 使用系统配置检查器,看系统是否符合安装sqlserver2014的所有要求 开始安装然后点击安装,全新sqlserver独立安装或向现有安装添加功能 安装规则然后就是使用默认的设置,点开详细信息,可以看到安......
  • asp.net里cookie、session进一步理解
    参照:session+cookie简单讲解以及持久化登录实现_session实现用户登录_AkagiSenpai的博客-CSDN博客sessionID和cookie-哈哈呵h-博客园(cnblogs.com)概念介绍cookie——是http无状态特性的补充,是在客户端保持状态的方案,以key/value的形式进行保存。网站经常使用这个技术来......
  • 轮询 (nginx)理解
    原文链接:https://blog.csdn.net/lrtcsdn/article/details/93780545/轮询(Polling)是一种CPU决策如何提供周边设备服务的方式,又称"程序输入"(ProgrammedI/O)。轮询法的概念是:由CPU定时发出询问,依询问每一个周边设备是否需要其他服务,由即给予服务,服务结束后在问一个周边,接着不断周而复......
  • 新档案法解读①丨法规太多、不理解,如何在企业实践中落地?
    上一次,我们列举了关于档案管理需要遵守的法律法规清单,想要了解详情的,可点击档案信息化建设,这份法律法规清单,请收好。关于如何依法进行档案管理,许多朋友仍有疑问。为此,我们开设了一个专栏,结合企业实践案例,详细解读档案管理的相关法规,帮助大家加强档案管理的规范性。本期,我们聊聊《中......
  • 通过 Demo 理解 hashCode 与 equals 的关系
    packagecom.heatdeath.object;importlombok.extern.slf4j.Slf4j;importjava.util.HashMap;importjava.util.Map;/***Author:heatdeath*Date:2018/4/19*Desc:*/@Slf4jpublicclassEqualsDemo{publicstaticvoidmain(String[]args){......
  • 理解kubernetes网络模型
    本文将探讨Kubernetes中的网络模型,以及对各种网络模型进行分析。UnderlayNetworkModel什么是UnderlayNetwork底层网络UnderlayNetwork顾名思义是指网络设备基础设施,如交换机,路由器,DWDM使用网络介质将其链接成的物理网络拓扑,负责网络之间的数据包传输。underlaynetwork......