先看一個函數:c++
function derivative(f,delta)ide
delta = delta or1e-4函數
return function(x)lua
return (f(x+delta)-f(x))/deltaspa
endit
end io
對特定的函數f調用derivative(f)將(近似地)返回其導數,例如function
c=derivative(math.sin)class
print(math.cos(10),c(10)) --c(10)這樣的調用至關於derivative(math.sin)(10)匿名函數
這個例子最讓我驚奇的是,10這個參數能夠直接經過(10)的方式傳進去裏面嵌套的函數。
1. 閉合函數,closure,就是一個函數加上該函數所需訪問的全部「非局部的變量」。
2. 非局部的變量,就是在內部嵌套函數能夠訪問的位於其外部嵌套環境中的局部變量,即不是全局變量也不是局部變量。即上面例子中的delta或者下面例子中的i。
例子:
Function newCounter()
local i= 0 –非局部變量
return function()
i= i+1
return i
end
c1 =newCounter() -- not c1 = newCounter,
Print(c1()) --1 至關於 newCounter()()
Print(c1()) --2 至關於 newCounter()()
因爲建立變量i的函數(newCounter)已經返回,因此以後的每次調用每次調用匿名函數時,i都應是已經超出了做用範圍,但其實lua會以closure的概念來正確地處理這種狀況。
在這裏,不由要問,這裏的i是怎樣保存起來的,是相似於c++中的局部靜態變量嗎?
這裏有一個答案來自網上:對於閉合函數而言,屬於它的非局部變量,並非在調用它的時候臨時產生的,而是和它一塊兒存在的。因此每次調用閉合函數,非局部變量的值都不會被重置。
3. 閉合函數的應用(重定義函數):沙盒
4. 因爲閉合函數的特殊,咱們須要注意兩種狀況:a.非全局函數的調用順序(須要前向聲明嗎?),function func () … end的寫法只是一種語法糖,它至關於func = function。b.正確的尾調用。