一、函數是匿名的
函數是匿名的是指它沒有名稱。
一個函數定義實際就是一條語句(更準確地說是一條賦值語句),這條語句創建了一種類型爲“函數”的值,並將這個值賦予一個變量。例如,討論print函數時,實際上是在討論一個持有某函數的變量。
在C語言中,我們的習慣是一個函數一定有函數名,而lua中,函數是可以沒有函數名的,函數名相當於是函數的一個變量。
例如:
上面函數的本質是下面的函數。
可以將表達式“function(x)<body> end” 看做是函數的構造式。
二、函數的詞法域
詞法域是指一個函數嵌套在另一個函數中,內部的函數可以訪問外部函數中的局部變量。
1. Closure(閉合函數) :一個函數加上該函數所需訪問的所有“非局部的變量”。
匿名函數中的i 是函數newCounter中的局部變量,也就是說內部函數可以訪問外部函數,在匿名函數中這樣的變量叫做非局部的變量(non-local variable)。
如上例中,如果再次調用newCounter,就會創建一個新的局部變量i,從而得到一個新的closure。
三、將函數存儲在構造式中:
四、局部函數
將一個函數存儲到一個局部變量中,得到一個“局部函數”
局部函數在遞歸調用時要注意:
由於Lua編譯到調用f(n-1)的地方時,局部的f還未定義完畢,因此此處是在調用一個全局的f,而不是此函數自身。解決辦法是:先定義一個局部變量,然後調用。
五、尾調用
在Lua中,只有“return <func>(<args>)”這樣的調用形式纔算是一條尾調用。
尾調用類似於goto的函數調用。好處是在尾調用後,程序不需要保存任何關於該函數的棧信息了,因此,進行尾調用時不耗費任何棧空間。