函数高级特性

像新版c++一样,lua支持lambda表达式。也就是可以在函数内部声明函数。内层的函数可以访问外一层函数的局部变量。

一个函数以及它会访问到的外层函数的变量,称为闭包。这些变量又被称为upvalue。

实际上普通函数也是一种特殊的closure(没有要访问的外层变量)。

执行不受信任的代码时,需要一个安全的运行环境,称为“沙盒”。例如,沙盒会把文件的读写重定向到安全的地方,或干脆限制某些文件的读写。

递归函数的调用


local fact
fact = function(n)
  if n == 0 then return 1
  else return n*fact(n-1)
  end
end

注意由于函数递归,需要先定义fact为一个局部变量。否则运行时找不到函数内部定义的局部变量fact。


若一个函数最后(在返回前)调用了另外一个函数,就称为尾调用。Lua的尾调用可以先清除调用函数的栈,再进入被调用函数的栈。这样就不会导致栈溢出的问题。