Lua 學習筆記(四) —— 函數(二)

一、函數是匿名的

函數是匿名的是指它沒有名稱。

一個函數定義實際就是一條語句(更準確地說是一條賦值語句),這條語句創建了一種類型爲“函數”的值,並將這個值賦予一個變量。例如,討論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的函數調用。好處是在尾調用後,程序不需要保存任何關於該函數的棧信息了,因此,進行尾調用時不耗費任何棧空間。

 


發佈了49 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章