快速业务通道

闭包的概念、形式与应用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-07

随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能问题所限制的动态语言开始受到关注,Python、Ruby 和 Lua 等语言都开始在应用中崭露头角.动态语言因其方便快捷的开发方式成为很多人喜爱的编程语言,伴随动态语言的流行,我们经常听到一个名词——闭包,很多人会问闭包是什么?闭包是用来做什么的?本文汇集了有关闭包的概念、应用及其在一些编程语言中的表现形式,以供参考.
什么是闭包?

闭包并不是什么新奇的概念,它早在高级语言开始发展的年代就产生了.闭包(Closure)是词法闭包(Lexical Closure)的简称.对闭包的具体定义有很多种说法,这些说法大体可以分为两类:

一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭包是在其词法上下文中引用了自由变量(注 1)的函数.
另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体.比如参考资源中就有这样的的定义:在实现深约束(注 2)时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包.
这两种定义在某种意义上是对立的,一个认为闭包是函数,另一个认为闭包是函数和引用环境组成的整体.虽然有些咬文嚼字,但可以肯定第二种说法更确切.闭包只是在形式和表现上像函数,但实际上不是函数.函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,一个函数只有一个实例.闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例.所谓引用环境是指在程序执行中的某个点所有处于活跃状态的约束所组成的集合.其中的约束是指一个变量的名字和其所代表的对象之间的联系.那么为什么要把引用环境与函数组合起来呢?这主要是在支持嵌套作用域的语言中,有时不能简单直接地确定函数的引用环境.这样的语言一般具有这样的特性:

函数是一阶值(First-class value),即函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值.
函数可以嵌套定义,即在一个函数内部可以定义另一个函数.

Empire CMS,phome.net

这些概念上的解释很难理解,显然一个实际的例子更能说明问题.Lua 语言的语法比较接近伪代码,我们来看一段 Lua 的代码:


清单 1. 闭包示例1

function make_counter()
local count = 0

function inc_count()
count = count 1
return count

end
return inc_countendc1 = make_counter()c2 = make_counter()print(c1())print(c2())

在这段程序中,函数 inc_count 定义在函数 make_counter 内部,并作为 make_counter 的返回值.变量 count 不是 inc_count 内的局部变量,按照最内嵌套作用域的规则,inc_count 中的 count 引用的是外层函数中的局部变量 count.接下来的代码中两次调用 make_counter() ,并把返回值分别赋值给 c1 和 c2 ,然后又依次打印调用 c1 和 c2 所得到的返回值.

这里存在一个问题,当调用 make_counter 时,在其执行上下文中生成了局部变量 count 的实例,函数 inc_count 中的 count 引用的就是这个实例.但是 inc_count 并没有在此时被执行,而是作为返回值返回.当 make_counter 返回后,其执行上下文将失效,count 实例的生命周期也就结束了,在后面对 c1 和 c2 调用实际是对 inc_count 的调用,而此处并不在 count 的作用域中,这看起来是无法正确执行的.

上面的例子说明了把函数作为返回值时需要面对的问题.当把函数作为参数时,也存在相似的问题.下面的例子演示了把函数作为参数的情况.


清单 2. 闭包示例2

function do10times(fn)
for i = 0,9 do
fn(i)
end
end

sum = 0
function addsum(i)
sum = s

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号