Lua 学习笔记(四) —— 函数(二)
2014-10-15 16:01
591 查看
一、函数是匿名的
函数是匿名的是指它没有名称。
一个函数定义实际就是一条语句(更准确地说是一条赋值语句),这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。例如,讨论print函数时,实际上是在讨论一个持有某函数的变量。
在C语言中,我们的习惯是一个函数一定有函数名,而lua中,函数是可以没有函数名的,函数名相当于是函数的一个变量。
例如:
![](http://img.blog.csdn.net/20141015155702920?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA4NjE2Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
上面函数的本质是下面的函数。
可以将表达式“function(x)<body> end” 看做是函数的构造式。
二、函数的词法域
词法域是指一个函数嵌套在另一个函数中,内部的函数可以访问外部函数中的局部变量。
1. Closure(闭合函数) :一个函数加上该函数所需访问的所有“非局部的变量”。
![](http://img.blog.csdn.net/20141015155509843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA4NjE2Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
匿名函数中的i 是函数newCounter中的局部变量,也就是说内部函数可以访问外部函数,在匿名函数中这样的变量叫做非局部的变量(non-local variable)。
如上例中,如果再次调用newCounter,就会创建一个新的局部变量i,从而得到一个新的closure。
三、将函数存储在构造式中:
![](http://img.blog.csdn.net/20141015155516796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA4NjE2Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
四、局部函数
将一个函数存储到一个局部变量中,得到一个“局部函数”
![](http://img.blog.csdn.net/20141015155534343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA4NjE2Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
局部函数在递归调用时要注意:
![](http://img.blog.csdn.net/20141015155736194?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA4NjE2Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由于Lua编译到调用f(n-1)的地方时,局部的f还未定义完毕,因此此处是在调用一个全局的f,而不是此函数自身。解决办法是:先定义一个局部变量,然后调用。
五、尾调用
在Lua中,只有“return <func>(<args>)”这样的调用形式才算是一条尾调用。
尾调用类似于goto的函数调用。好处是在尾调用后,程序不需要保存任何关于该函数的栈信息了,因此,进行尾调用时不耗费任何栈空间。
函数是匿名的是指它没有名称。
一个函数定义实际就是一条语句(更准确地说是一条赋值语句),这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。例如,讨论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的函数调用。好处是在尾调用后,程序不需要保存任何关于该函数的栈信息了,因此,进行尾调用时不耗费任何栈空间。
相关文章推荐
- 编译原理之学习 lua 1.1 笔记 (二) 函数调用与局部变量
- Lua学习笔记之函数
- Lua 学习笔记(五)函数
- Lua 学习笔记(四) —— 函数(一)
- Lua学习笔记(函数)
- 编译原理之学习 lua 1.1 笔记 (四) 多变量赋值和函数多返回值
- Lua学习笔记二--在Lua中使用自己的C函数收藏
- Lua学习笔记之函数、变长参数、closure(闭包)、select等
- 5.lua学习笔记:函数
- Lua学习笔记(五):函数
- Lua学习笔记(七) 函数function简介
- Lua学习笔记 第五章 函数
- Lua学习笔记--函数初探
- DELPHI中集成LUA脚本学习笔记2_调用LUA函数(详)
- Lua学习笔记(六):函数-续
- Lua学习笔记之表和函数
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- [LUA学习笔记03]LUA函数和C函数的相互调用
- 【Lua学习笔记】 --> 《字符串string与table的函数操作》
- Lua学习笔记(6) : 在Lua中调用C++之函数