一、匿名函数
Lua中的函数其实都是匿名函数,我们定义函数的时候:
function foo (x) return 2*x end
等价于
foo = function (x) return 2*x end
这里foo只是保存匿名函数的变量。
1.lua的函数是一种 First-Class Value 的东西, 到底是啥?
就是它们与传统类型的变值没啥区别,
可以 存到一个变量中,
可以 存到table中,
可以 作为实参传递给其它函数,
可以 作为其它函数的返回值.
2.词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量.
两者结合,可以发挥神奇的作用,例:
function newCounter()
local i = 0
func = function()
i = i + 1
return i
end
return func
end
c = newCounter()
print(c())
print(c())
c1 = newCounter()
print(c1())
print(c1())
代码中, 函数 func 里访问了一个 “非局部的变量” i, 用于保存一个计数器
初步看,由于创建变量i的函数 newCounter 已经返回, 所以每次调用 func 时, 应该是超过了作用范围
其实不然, lua 会以 closure 的概念来处理这种情况.
一个 closure 就是一个函数加上该函数所需访问的所有”非局部的变量”
所以上例中 c1, c2 是同个函数所创建的两个不同的 closure, 它们各自拥有局部变量i的独立实例.
从技术上来讲, lua中只有 closure, 而不存在”函数”. 因为”函数”本身就是一种特殊的 closure。
二、非全局函数
函数可以放在表中,也可以放在局部变量中。
三、尾调用排除
lua中函数的最后一次操作若是调用函数,则该操作称为尾调用。尾调用所调用的函数是不会占栈空间的,所以它不会溢出。