练习:斐波纳契闭包!
我模仿前一节把代码写出来但是我还是不懂什么是闭包,这个和怎么感觉就像静态变量啊!求解释下谢谢.
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
cur,next:=0,1
return func() int{
cur,next=next,cur+next
return cur
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
[fibonacci.png](https://static.studygolang.com/180210/67a82bc29ea96a4c84b1aad78f18a8ee.png)
##### 闭包你可以这样理解,(一个**子函数实例** + 位于子函数外部环境中的**局部变量**)打包在一起形成的一个实例 (instance)。
**局部变量**的特点是,
- 每次调用**局部变量**所在的**母体函数**时,这些**局部变量**才会被创建(定义),
- **母体函数**返回时,这些**局部变量**就会被销毁。
可以认为每次对**母体函数**的调用时,**局部变量**是临时创建的新的实例,所以**局部变量**也叫临时变量。
如果**母体函数**中创建了一个**子函数实例**,并且这个子函数引用到了**母体函数**中的**局部变量**,那么问题就来了:
*这个**母体函数**中的**局部变量**不能在**母体函数**返回时就销毁,否则**子函数实例**被调用的时候,引用这个**局部变量**就会出现变量未定义的问题。*
***
解决方法就是将这个**母体函数**的**局部变量**跟这个**子函数实例**打包在一起,拥有相同的生命周期,保证**子函数实例**的正常调用。
这个**子函数实例**与其中引用到的**母体函数**中的**局部变量**实例打包在一起,就形成**闭包**。
**母体函数**多次被调用会创建多个独立的**闭包**,它们各自打包了自己被创建时**母体函数**临时创建的**局部变量**。两个不同的**闭包**所打包的同名**局部变量**并不是同一个实例。
**闭包**中的打包的**局部变量**只有当前闭包中的**子函数实例**才能访问。
哪怕是由同一个**母体函数**所创建出来的具备相同子函数的不同**闭包**,也不能互相访问内部**局部变量**。
***
**闭包**在很多语言中都有体现,通常闭包出现的形式类似*函数变量*或者*匿名函数*。
#5
更多评论
闭包在 JavaScript 中就是函数加上了词法作用域,在这个例子中,是把
```
func() int{ cur,next=next,cur+next return cur }
```
和 cur next 结合在一起,作为
```
f := fibonacci()
```
的返回值,也就是 f 本身是带着 cur next 这两个变量的。
这样,你循环多次调用的时候, cur next 就不停地更改增加了。
#1