閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即便已經離開了創造它的環境也不例外。 閉包
定義:閉包名稱源自於經過「捕獲」自由變量的綁定,從而對函數字面量執行的「關閉」行動。不帶自由變量的函數字面量,如:(x:Int) => x + 1,被稱爲封閉項(closed term),這裏項(term)指的是一小部分源代碼。所以依照這個函數字面量在運行時建立的函數值嚴格意義上來說就不是閉包,由於(x:Int) => x + 1在編寫的時候就已經封閉了。但任何帶有自由變量的函數字面量,如:(x:Int) => x + more,都是開放項(open term)。所以,任何以(x:Int) => x + more爲模板在運行期建立的函數值將必須捕獲對自由變量more的綁定。所以獲得的函數值將包含指向捕獲的more變量的索引。又因爲函數值是關閉這個開放項(x:Int) => x + more行動的最終產物,所以被稱爲閉包。 函數
1. 如(x: Int) => x + 1匿名函數,x做爲參數是已知的,整個表達式構成 封閉術語,函數在運行時就已經封閉的,根據引用透明的定義(一個表達式能夠被自身結果替代[第一類值]而不影響程式),而純函數的定義是——單例的引用透明表達式,因此不包含自由變量的函數就是純函數。 索引
2. 包含一個或多個自由變量,如(x: Int) => x + more,其中more就是自由變量,more只有在運行期才肯定它的值,即惰性求值,因爲函數值是關閉這個[開放術語] (x: Int) => x + more的行動的最終產物,獲得的函數值將包含一個指向捕獲的more變量的參考,所以被稱爲閉包。 模板