- 0X17 函数为值
- 首先说明Lua中的变量的“创建”和“删除”。
- 严格来说Lua中的变量并不需要创建和删除。就像数学中的x,y,z等符号。需要的时候赋个值,不需要的时候也不需要作什么特殊处理。
- 但是,现代的计算机体系中存储空间是有限的资源。如果让无用数据一直占据存储空间将会严重影响计算。因此,需要在数据不用后回收内存,在有用数据需要保存的时候把空间分配给有用数据。
- Lua的内存管理是自动进行的。我们只需要大致知道哪些操作会导致内存的分配和回收即可。习惯上,可能导致存储空间分配给有效数据的操作叫做创建变量,可能导致存储空间回收(删除无用数据)的操作称为删除变量。
- 导致变量创建的操作主要有给变量赋予非nil的值。例如:
x=print y=1234 y=56 z=''
- 把nil赋值给一个变量会导致变量删除,变量中存储的数据消失,对应的存储空间被回收。例如:
x=nil
- 如果你已经学过表相关的内容。应当注意,把nil赋予表的成员,会从表中删除这个成员。
- 虽然习惯上说创建变量和删除变量。但是这都是为了符合其他语言的习惯。Lua中的变量其实不能被真正创建或者删除。访问一个没有赋予初始值的变量(没有初始化),也会返回nil。
- 除了赋予非nil值的赋值语句以外,还有一些其他语句。可以起到创建变量的作用,例如迭代遍历的for循环语句和函数定义语句。它们都可以看作赋值语句的简写或者包含了赋值语句。以函数定义为例
function fun(x) return x*x end fun=function (x) return x*x end
- 这两个语句的效果是等价的。第一行是我们熟悉的函数定义。下边那行代码,是一个赋值语句。赋予了变量fun一个值。只要赋值非nil,就会引起变量创建。
- 需要解释一下的是赋值符号的右边。其实就是函数语句没有写函数名。它可以看作一个表达式,会返回一个函数。这个函数执行时的动作就如表达式中所定义,接受一个参数然后返回这个参数的平方。
- 不写函数名定义出来的函数称为匿名函数。
- 匿名函数有个特点就是,如果创建出来以后不把它赋予一个变量或者当作参数传递出去,它马上就会被销毁(存储空间回收)。
- 这是好处也是坏处。好处就是有些在程序中只有一次的函数,使用这种方法定义,用过即丢,不用操心它占用内存。
- 坏处就是由于它没有名字,所以不能通过变量名访问它。如果你想多次访问,就要像这里写的一样把它赋予一个变量。更精简的写法就是之前课程所学的函数定义。
- 总之,指定函数名的函数定义语句会创建函数名这个变量。因为它等价于先创建匿名函数然后赋值给变量。
- 一般而言对同一个变量的两次赋值之间变量的值应该保持一定。但是如果不注意可能会造成在两次赋值之间变量值也发生改变的情况。变量作用域的引入就是为了解决这个问题。下一节正式讨论这个问题。
- 0X1D 变量作用域