Reglas de visibilidad

Lua es un lenguaje de ámbito léxico. El ámbito de las variables comienza en la primera sentencia después de su declaración y dura hasta el final del bloque más interno que incluye la declaración.

Consideremos el ejemplo siguiente:
x = 10 -- global variable
do -- new block
local x = x -- new 'x', with value 10
print(x) --> 10	
x = x+1 
do -- another block
local x = x+1 -- another 'x'
print(x) --> 12
end		
print(x) --> 11	
end 
print(x) -->  10 (the global one)

Fíjate que, en una declaración como ' local x = x, la nueva ' x que se está declarando aún no está en ámbito, por lo que la segunda ' x hace referencia a la variable exterior.

Debido a las reglas de ámbito léxico, las funciones definidas dentro de su ámbito pueden acceder libremente a las variables locales. Una variable local utilizada por una función interna se denomina upvalue, o variable local externa, dentro de la función interna.

Observe que cada ejecución de una sentencia local define nuevas variables locales. Consideremos el ejemplo siguiente:
a = {}
local x = 20
for i=1,10 do
local y = 0
a[i] = function () y=y+1; return x+y end
end
El bucle crea diez cierres (es decir, diez instancias de la función anónima). Cada uno de estos cierres utiliza una variable " y " diferente, mientras que todos comparten la misma variable " x