在Lua语言中,函数是严格遵循词法定界的第一类值。
1 函数是第一类值
function foo(x) return 2*x end
----等价于
foo = function(x) return 2*x end
a = {p = print} -- 'a.p'指向'print'函数
a.p("Hello World") --> Hello World
print = math.sin -- print现在指向sine函数
a.p(print(1)) --> 0.8414709848097
math.sin = a.p -- 'sin'现在指向print函数
math.sin = (10,20) --> 10 20
2 非全局函数
函数不仅可以被存储在全局变量中,还可以被存储在表字段和局部变量中。
存储在表中:
Lib = {
foo = function (x,y) return x + y end
goo = function (x,y) return x - y end
}
存储在局部变量中:
local function f (params)
body
end
3 词法定界
当编写一个被其他函数B包含的函数A时,被包含的函数A可以访问包含其的函数B的所有变量,这种特性称为词法定界。
闭包:一个函数外加能够使该函数正确访问非局部变量所需的其他机制。
如下方代码:c1和c2是不同的闭包。他们建立在相同的函数之上,但是各自拥有局部变量count的独立实例。
function newCounter ()
local count = 0
return function ()
count = count + 1
return count
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
c2 = newCounter()
print(c2()) --> 1
print(c1()) --> 3
print(c2()) --> 2