您的位置:首页 > 编程语言 > Lua

Lua 学习笔记(四) —— 函数(二)

2014-10-15 16:01 591 查看
一、函数是匿名的

函数是匿名的是指它没有名称。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: