博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包的探索
阅读量:4680 次
发布时间:2019-06-09

本文共 1204 字,大约阅读时间需要 4 分钟。

闭包的概念、形式与应用

什么是闭包?

对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 说法1:闭包是符合一定条件的函数,比如闭包是在其词法上下文中引用了自由变量的函数。 说法2:闭包是由函数和与其相关的引用环境组合而成的实体。比如在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。

具体可以看这个文章《》

结合实际代码分析闭包

支持了闭包的语言有很多,这里以go语言为例。

将函数作为一个函数的返回值

package mainimport "fmt"func add() func(int) int { ---add()函数返回一个匿名函数 sum := 0 ---add()内部的局部变量 return func(x int) int { ----返回一个匿名函数,下文提到的匿名函数均指该函数 sum += x ----函数内部实现sum+参数x return sum } } func main() { pos, neg := add(), add() ----将两个add()函数的返回(上面的匿名函数)分别赋给两个变量,也就是说这两个变量代表的其实就是两个函数 for i := 0; i < 10; i++ { fmt.Println( pos(i), ----相当于上面匿名函数调用,参数为i neg(-2*i), --------相当于上面匿名函数调用,参数为-2*i ) } }

我们来看看执行结果:

0 01 -23 -6 6 -12 10 -20 15 -30 21 -42 28 -56 36 -72 45 -90

从结果可以看出来,在循环里面每次顺序调用pos, neg两个函数,即连续调用两次上述匿名函数。

第一次循环体执行之后结果都为0就不说了;第二次循环体执行时调用pos时参数为i=1,经过调用pos函数(内部对局部变量sum+i)返回的sum变为1;调用neg时参数为i=1,经过调用pos函数(内部对局部变量sum+(-2*i))返回的sum变为-2。

注意,调用neg时并没有因为调用pos使sum变为1,而在sum=1的基础上做sum+(-2*i),sum仍是以0值进行计算。

第三次循环体执行时,pos和neg内部分别以自己上次调用返回的sum作为新值进行计算。

pos和neg内部的sum是互相隔离的,在pos调用之后调用neg,会将sum变为neg之前对应的sum值;neg调用之后调用pos,同样也会将sum变为pos之前对应的值。这也就证实了上面关于闭包的说法2更确切一点。即闭包是函数和与其相关的引用环境打包之后的一个整体

将函数作为一个函数的参数

---未完待续---

转载于:https://www.cnblogs.com/xuxiaojian/p/9498699.html

你可能感兴趣的文章
jQuery基础教程
查看>>
P2709 小B的询问
查看>>
第三组的抓包作业
查看>>
ILNumerics项目的应用之线性方程
查看>>
django考点
查看>>
python-socket
查看>>
Android中intent如何传递自定义数据类型
查看>>
android基础---->子线程更新UI
查看>>
SharedPreferences
查看>>
转载 线程池之ThreadPool类与辅助线程 - <第二篇>
查看>>
js获取元素样式
查看>>
合并排序(C语言实现)
查看>>
sql 计算两时间或日期 的相差的 年、 月、 日、时、分、秒,年、月、日分别的提取...
查看>>
HDU 1176免费馅饼 DP数塔问题转化
查看>>
十进制二进制转换
查看>>
shiro实战系列(七)之Realm
查看>>
超像素、语义分割、实例分割、全景分割 傻傻分不清?
查看>>
HMM学习
查看>>
Mysql扩展之replication概述
查看>>
C++中数值的后缀
查看>>