Regole di visibilità

Lua è un linguaggio a scope lessicale. L'ambito delle variabili inizia dalla prima istruzione dopo la loro dichiarazione e dura fino alla fine del blocco più interno che include la dichiarazione.

Tenere presente i seguenti esempi:
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)

Si noti che, in una dichiarazione come 'local x = x, il nuovo 'x che viene dichiarato non è ancora nello scope e quindi il secondo 'x si riferisce alla variabile esterna.

Grazie alle regole di scoping lessicale, le variabili locali possono essere liberamente accessibili dalle funzioni definite all'interno del loro ambito. Una variabile locale utilizzata da una funzione interna è chiamata upvalue, o variabile locale esterna, all'interno della funzione interna.

Si noti che ogni esecuzione di un'istruzione locale definisce nuove variabili locali. Tenere presente i seguenti esempi:
a = {}
local x = 20
for i=1,10 do
local y = 0
a[i] = function () y=y+1; return x+y end
end
Il ciclo crea dieci chiusure (cioè dieci istanze della funzione anonima). Ciascuna di queste chiusure utilizza una variabile 'y diversa, mentre tutte condividono la stessa 'x