一、函数是匿名的
函数是匿名的是指它没有名称。
一个函数定义实际就是一条语句(更准确地说是一条赋值语句),这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。例如,讨论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的函数调用。好处是在尾调用后,程序不需要保存任何关于该函数的栈信息了,因此,进行尾调用时不耗费任何栈空间。