ITKeyword,专注技术干货聚合推荐

注册 | 登录

函数编程之闭包漫谈(Closure)

shenlanzifa 分享于 2015-09-06

推荐:JavaScript函数闭包(closure) 的理解

自从学习JavaScript以来,一直对函数闭包不是太理解。知道大概是什么个意思,但是要将一个不会的人教会还真不行。总之就是不能彻底的理解。   今天看到的这篇文

2019阿里云双12.12最低价产品入口(新老用户均可),
地址https://www.aliyun.com/minisite/goods

在学习golang和scala语言时,对闭包这个概念理解的一直不是很好,直到今天看到一篇博文,感觉茅塞顿开。下面是全文的转载: 原文地址:http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.htm 在函数编程中经常用到闭包。闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。本文将结合实例代码进行解释。 函数是什么 地球人都知道:函数只是一段可执行代码,编译后就“固化”了,每个函数在内存中只有一份实例,得到函数的入口点便可以执行函数了。在函数式编程语言中,函数是一等公民(First class value:第一类对象,我们不需要像命令式语言中那样借助函数指针,委托操作函数),函数可以作为另一个函数的参数或返回值,可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。如: >>>

def

ExFunc(n):

sum = n

def

InsFunc():

return

sum + 1

return

InsFunc >>>

myFunc = ExFunc( 10 ) >>>

myFunc() 11 >>>

myAnotherFunc = ExFunc( 20 ) >>>

myAnotherFunc() 21 >>>

myFunc() 11 >>>

myAnotherFunc() 21 >>> 在这段程序中,函数InsFunc是函数ExFunc的内嵌函数,并且是ExFunc函数的返回值。我们注意到一个问题:内嵌函数InsFunc中引用到外层函数中的局部变量sum,IronPython会这么处理这个问题呢?先让我们来看看这段代码的运行结果。当我们调用分别由不同的参数调用ExFunc函数得到的函数时(myFunc(),myAnotherFunc()),得到的结果是隔离的,也就是说每次调用ExFunc函数后都将生成并保存一个新的局部变量sum。其实这里ExFunc函数返回的就是闭包。 引用环境 按照命令式语言的规则,ExFunc函数只是返回了内嵌函数InsFunc的地址,在执行InsFunc函数时将会由于在其作用域内找不到sum变量而出错。而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。现在给出引用环境的定义就容易理解了:引用环境是指在程序执行中的某个点所有处于活跃状态的约束(一个变量的名字和其所代表的对象之间的联系)所组成的集合。闭包的使用和正常的函数调用没有区别。 由于闭包把函数和运行时的引用环境打包成为一个新的整体,所以就解决了函数编程中的嵌套所引发的问题。如上述代码段中,当每次调用ExFunc函数时都将返回一个新的闭包实例,这些实例之间是隔离的,分别包含调用时不同的引用环境现场。不同于函数,闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

推荐:[从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)

 jQuery片段: [javascript]  view plain copy (function(){   //这里忽略jQuery所有实现   })();     半年前初次接触jQuery的时候,我也像其他人一样很兴奋地

在学习golang和scala语言时,对闭包这个概念理解的一直不是很好,直到今天看到一篇博文,感觉茅塞顿开。下面是全文的转载: 原文地址:http://www.cnblogs.com/Jifangliang/archive/2008/08/05/

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。