有些同学会不理解什么是闭包,和匿名函数有什么区别,为什么闭包会占用内存?
什么是闭包?
- 一个函数和与其相关的环境组合而成的实体
- 由于闭包是和其所在环境相关的,所以直到闭包对象被释放,闭包内部的内存是不会释放的
举个go语言的例子
func main() {
f := adder()
fmt.Println(f(1), f(2), f(3)) // 2, 4 7
}
func adder() func(int) int {
x := 1
return func(d int) int {
x += d
return x
}
}
解释下代码流程
- 首先变量 f 是一个函数类型的变量,其值就是 adder 返回的一个匿名函数
- 而这个返回的匿名函数并不是一个单纯的匿名函数,其中使用了 adder 的内部变量x
- 也就是在 f 是一直会持有 x 这个变量直到 f 退出其所在的变量作用域,x 才会被回收,并不是在调用完 adder 就被回收了
- 由于 f 始终持有 x ,所以每次调用 f 时,对 x 的赋值操作都会被保留,直到 f 被回收结束
下面的例子可自行理解一下
func adder(x int) func(int) int {
return func(d int) int {
x += d
return x
}
}
func proc() {
f1 := adder(1)
fmt.Println(f1(1), f1(2), f1(3)) // 2, 4 7
f2 := adder(10)
fmt.Println(f2(1), f2(2), f2(3)) // 11, 13, 16
}