# 函數
* * * * *
--: 作者:mick
時間:2019年1月23日
* * * * *
1. 函數分類
2. 什么是回調函數
2. 什么是匿名函數
3. 什么是閉包函數
4. 什么是自由變量
### 函數的分類
1. 普通函數
2. 匿名函數
3. 閉包函數
4. 高階函數
5. 回調函數
實現上述的其那題是:**支持頭等函數(First Class Function)的編程語言,可以把函數賦值給變量,也可以把函數作為其它函數的參數或者返回值。Go 語言支持頭等函數的機制**(https://studygolang.com/articles/12789?fr=sidebar)
### 什么是匿名函數:
定義:沒有名字的函數就是匿名函數
### 什么是閉包函數:
問題1:普通函數內部可以直接讀取全局變量
問題2:什么時候函數可以訪問局部變量
```
func Closure()func() int {
var n int
return func()int{
n++
return n
}
}
```
**官方定義:**“官方”的解釋是:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分
**閉包的特性:**
1. 封閉性:外界無法訪問閉包內部的數據,如果在閉包內聲明變量,外界是無法訪問的,除非閉包主動向外界提供訪問接口;
2. 持久性:一般的函數,調用完畢之后,系統自動注銷函數,而對于閉包來說,在外部函數被調用之后,閉包結構依然保存在
,系統中,閉包中的數據依然存在,從而實現對數據的持久使用。
### 總結:
1. 閉包是一個有記憶的函數。
2. 閉包相當于一個只有一個方法的緊湊對象(a compact object)