Skip to content

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。