闭包的探索
Posted xuxiaojian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包的探索相关的知识,希望对你有一定的参考价值。
闭包的概念、形式与应用
什么是闭包?
对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 说法1:闭包是符合一定条件的函数,比如闭包是在其词法上下文中引用了自由变量的函数。 说法2:闭包是由函数和与其相关的引用环境组合而成的实体。比如在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。
具体可以看这个文章《闭包的概念、形式与应用》
结合实际代码分析闭包
支持了闭包的语言有很多,这里以go语言为例。
将函数作为一个函数的返回值
package main
import "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 0
1 -2
3 -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更确切一点。即闭包是函数和与其相关的引用环境打包之后的一个整体
将函数作为一个函数的参数
---未完待续---
以上是关于闭包的探索的主要内容,如果未能解决你的问题,请参考以下文章