3.5 - 可见性规则
Lua语言在词法上是有作用域的。局部变量的作用域从它声明后的第一条语句开始,一直到它声明处最后的非空语句,如果最后一条非空语句是包含嵌套的,那么就到最后的最深处的语句为止。(空语句就是单纯的标签和空白语句。)请看下面的代码:
lua
x = 10 -- 全局变量
do -- 新的语句块
local x = x -- 新的变量x,值为10
print(x) --> 打印 10
x = x+1
do -- 另一个块
local x = x+1 -- 另一个变量‘x’
print(x) --> 打印 12
end
print(x) --> 打印 11
end
print(x) --> 打印 10 (那个全局的x值)
注意,在 local x = x 这样的声明中,新的x这时还没有在作用域内真的被声明出来,所以右侧的x引用的是外部变量。
因为作用域规则,局部变量在它的作用域下可以被其下所定义的函数任意地访问。被内部函数使用的局部变量被称为上值 upvalue(或者叫外部局部变量,又简称外部变量)。
要注意,每条local语句的执行都会定义一个新的局部变量。请看以下代码:
lua
a = {}
local x = 20
for i = 1, 10 do
local y = 0
a[i] = function () y = y + 1; return x + y end
end
这个循环创建了十个闭包(即十个匿名函数实例)。其中每个闭包都使用不同的y变量,却共用同一个x。