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的函数调用。好处是在尾调用后,程序不需要保存任何关于该函数的栈信息了,因此,进行尾调用时不耗费任何栈空间。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值