1. 函数作为“第一类值”,可以存储在变量或table中,可以作为函数实参,或者函数返回值。
2. 函数是匿名的,诸如print的函数名,只是持有该函数的变量。
a = {p = print}
a.p("Hello World!") --> Hello World!
print = math.sin
a.p(print(1)) --> 0.841470
3. closure(闭合函数)
词法域的概念:一个函数写在另一个函数内,那么位于内部的函数便可以访问外部函数中的局部变量。
在lua中可以通过closure来构造沙盒:
do
local oldOpen = io.open
local access_OK = function (filename, mode)
<检查访问权限>
end
io.open = function (filename, mode)
if access_OK(filename, mode) then
return oldOpen(filename, mode)
else
return nil, "access denied"
end
end
end
4. 局部函数的递归调用
错误的调用: 正确的调用:
local fact = function(n) local fact
if n == 0 then return 1 fact = function (n)
else return n * fact(n - 1) if n == 0 then return 1
end else return n * fact(n - 1) end
end end
推荐这样声明:
local functon fact (n)
if n == 0 return 1
else return n * fact(n - 1)
end
end
注意:间接调用时必须前向声明。
5. 尾调用
尾调用消除:进行尾调用的函数在执行尾调用后,会释放栈信息。
尾调用判断准则:一个函数在调用完另一个函数之后,是否就无其他事情需要做了。
return g(x) + 1
return (g(x))
return x or g(x) 都不是尾调用。