Lua is a lexically scoped language.The scope of a local variable begins at the first statement afterits declaration and lasts until the last non-void statementof the innermost block that includes the declaration.Consider the following example:
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)
Notice that, in a declaration like local x = x
,the new x
being declared is not in scope yet,and so the second x
refers to the outside variable.
Because of the lexical scoping rules,local variables can be freely accessed by functionsdefined inside their scope.A local variable used by an inner function is calledan upvalue, or external local variable,inside the inner function.
Notice that each execution of a local statementdefines new local variables.Consider the following example:
a = {} local x = 20 for i=1,10 do local y = 0 a[i] = function () y=y+1; return x+y end end
The loop creates ten closures(that is, ten instances of the anonymous function).Each of these closures uses a different y
variable,while all of them share the same x
.