有些語言確實是不區分的,它的function(表示code)跟int, double的地位是同樣的。這種語言就爲函數是第一類值。
但問題是,有些語言是不能存儲函數,不能動態建立函數,不能動態銷燬函數。(這裏函數是已是廣義的了,用來表示代碼code)。只能存儲一個指向函數的指針,這種語言稱爲函數是第二類值。閉包
另外有些語言不單能夠傳遞函數,函數裏面又用到一些外部信息(包括code, data)。那些語言能夠將函數跟函數所用到的信息一塊兒傳遞存儲。這種將函數和它所用的信息做爲一個總體,就爲閉包。函數
好比排序,A讓B排序,B會作排序,但排序須要知道哪一個比哪一個大,這點B本身不知道,就須要A告訴它。而這種判斷那個大,自己是一種動做,既然C語言中不能夠傳進第一值的函數,就設計成傳遞第二值的函數指針,這個函數指針就是A傳向B的信息,用來表示一個行爲。這裏原本A調用B的,結果B又調用了A告訴它的信息,也就叫callback。spa
跟着再將回調的概念進化,好比某人同時關心A,B,C,D,E,F事件,而且這些事件是一組的,好比敲鍵盤,鼠標移動,鼠標點擊等一組。將一組事件結合起來。在有些語言就變成一個接口,接口有N個函數。有些語言就映射成一個結構,裏面放着N個函數指針。跟着就不是將單個函數指針傳進去,而是將接口,或者函數指針的結構傳進去。這些根據不一樣的用途,有些人叫它爲代理啊,監聽者啊,觀察者啊等等。設計