什么是闭包(Closure)?

原文地址:http://www.ggat.cn/newsInfo.html/128

 

先看个C#例子:

private Thread t1 =null;void CreateThread(){     string x = "Hello,";     t1 = new System.Threading.Thread(delegate()            {               string y = "Closure!";               System.Console.Write(x+y);            });}void DoThread(){   CreateThread();   t1.Start();}

通过这个简单的例子,可以发现几个特点:
1、变量x不是通过参数传递到匿名函数中,而是在匿名函数中直接引用,从语法上来讲好像也是合理的,因为匿名函数的作用域在创建时变量x是在其范围内的。
2、变量x是在CreateThread中定义的,那么CreateThread执行完后,变量x应该被回收,但本例中显然不会。因为匿名函数的引用导致了变量x的生命周期延长到匿名函数执行完成。

好了,现在可以来说说闭包了,关于闭包的定义基本如下:
闭包是词法闭包(Lexical Closure)的简称,是引用了外部变量的函数。
这个被引用的外部变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

闭包的作用简单来说就是能够方便的调用外部变量,容易和优雅的按需创建匿名方法,减少代码量和简化操作。
应用场景适合引用环境在运行时可能发生变化时使用,若函数在定义和运行时的引用环境是相同的,则没必要使用闭包。

支持闭包的语言一般具有如下特性:
1、函数可以作为一个变量的值,也可以作为另外一个函数的返回值或参数。
2、函数可以嵌套定义,即在一个函数内部可以定义另外一个函数。
3、可以捕获引用环境。并把引用环境和函数代码组成一个可调用执行的实体。
4、允许定义匿名函数。

一些其他有意思的说法:
对象是附有行为的数据,而闭包是附有数据的行为。
如果把闭包从一个语法机制提升为一种设计概念,那么闭包是从用户角度考虑的一种设计概念,它基于对上下文的分析,把龌龊的事情、复杂的事情和外部环境交互的事情都自己做了,留给用户一个很自然的接口。

转载于:https://my.oschina.net/u/3740241/blog/1583724

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值