关于闭包的个人理解

维基百科上的解释:

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

Peter J. Landin 在1964年将术语闭包定义为一种包含环境成分和控制成分的实体


对于闭包这个名字,它的来源我没有考证过,我感觉它应该是来自于数学领域的,在高中都学过开闭区间吧,而开区间其实是这样的集合,(0,100)这个集合不包括0和100,但是它却使用0和100来进行描述,其实开区间(0,100)和描述它时用到的0和100就是一个闭包,而0,100就是所谓的自由变量

上面这个例子很浅显也很常见,但是对于没有理解闭包的人来说应该还是感觉不理解。

其实在理解闭包的概念之前先知道它的来源以及用途会很很有帮助,闭包这个概念应该广泛用于FP(Functional Programming函数式程序设计)中的,在了解闭包之前应该先简单理解一下函数式编程:

1、FP中的一等公民是函数,所谓一等公民指的是语言中最通用的数据类型,在java中是对象,对象被广泛使用,它可以被当做参数传入一个方法,也可以作为返回值使用,而在FP中,函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

2、纯函数,是说一个函数没用“副作用(side effect)”,1)不修改外界状态 2)相同的输出,永远会得到相同的输出。(意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。)

3、高阶函数——参数中出现函数或者返回值是函数——的一个函数。

4、当然还有闭包。

从上面可以看到,函数式编程强调函数无副作用,FP中函数不会改变变量的值,永远都是复制一份最后得到一个新的值,所以闭包就有了存在的价值,由于我们不能改变变量,在函数调用函数,函数返回函数的时候,得到的那一份新的数据值+被调用或者被返回的函数=闭包。

从另一个角度考虑:我们通常把程序理解成两部分,代码和数据。代码是程序运行的逻辑,数据是逻辑需要处理的元素。在非函数式编程语言中,这2种概念被区分的非常清晰。然而数据和指令说到底都是0101的存储数据,代码指令执行时候,会处于一定的环境,单纯将代码保存下来,还是不够的,需要将代码所处的环境也保存下来。闭包其实是,将代码跟代码所处于的环境做为一个整体来看待。周围的环境,表现为代码所使用的数据。在有些语言中,这个概念叫代码块(block),匿名函数(lambda)等等。数据跟代码不再人为割裂开来,统一起来看待。闭包就会是很自然的概念。

总结一下 :数据可以传递,指令也是可以传递的,而指令自己单独存在是纯函数,与它的“环境”一同存在的时候就是闭包了。

其实初步理解了闭包没有什么用处,也许结合js的作用域链可以理解js是怎么实现闭包的,而更重要的是了解函数式编程并进一步对闭包进行应用才能真正理解闭包。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值