Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。
假设函数f2定义在函数f1中,那么就称f2为f1的内嵌(inner)函数,f1为f2的外包(enclosing)函数,外包和内嵌都具有传递性,即f2的内嵌必然是f1的内嵌,而f1的外包也一定是f2的外包。
内嵌函数可以访问外包函数已经创建的所有局部变量,这种特性便是所谓的词法定界(lexical scoping),而这些局部变量则称为该内嵌函数的外部局部变量(external local variable)或者upvalue(这个词多少会让人产生误解,因为upvalue实际指的是变量而不是值)。
用用简单的话来说upvalue:(也许不太严格,只为快速理解)
upvalue:嵌套函数的外部函数的局部变量
function func(a) -- 这个函数返回值是一个函数
return function ()
a = a + 1 -- 这里可以访问外部函数func的局部变量a,这个变量a就是upvalue
return a
end
end
闭包:一个匿名函数加上其可访问的upvalue。