En scripting, un bloque de código es el cuerpo de una estructura de control o de una función .El alcance de una variable o función es el bloque de código que puede acceder a ella, y puede ser global o local .Todos los bloques pueden acceder a variables y funciones globales.Un bloque puede acceder a variables y funciones locales en su bloque padre, pero no en ninguno de sus bloques hijos.
Las variables y las funciones tienen alcance global por defecto, pero casi siempre es mejor declararlas con alcance local porque Luau accede a las variables y funciones locales más rápido que las globales.Para dar un alcance local a una variable o función, pon la palabra clave local delante de su nombre cuando la declaras.
Los scripts no pueden acceder a variables y funciones globales y locales en otros scripts.Si quieres compartir valores y funciones entre scripts, usa ModuleScripts.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- El bloque B puede acceder a la variable local en el bloque A.
- El bloque C puede acceder a las variables y funciones locales en los bloques A y B.
- El bloque A no puede acceder a las variables y funciones locales en los bloques B o C.
- El bloque B no puede acceder a la variable local en el bloque C.
Alcance global
Después de declarar una variable o función global, cualquier bloque de código en el mismo script puede acceder a ella.Las variables y las funciones tienen alcance global a menos que las declares con la palabra clave local.
En el siguiente código, testVar tiene alcance global dentro de la función local testFunc().Cuando Luau llama al , asigna el valor .El testVar tiene alcance global, por lo que la función print() fuera de testFunc() puede acceder a ella y imprimir 64 .
Example of global functions and variables
local function testFunc() -- alcance local
testVar = 64 -- escopo global
end
testFunc()
print(testVar) -- 64
En el siguiente código, la variable global comienza en , aumenta en con cada iteración del bucle , y se imprime nuevamente más tarde con un valor final de 4.
x = 0 -- Variable global "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ Resultado de Salida:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
Es más fácil declarar variables y funciones globales porque no necesitas escribir tanto, pero las variables y funciones globales tienen los siguientes desventajas en comparación con las locales:
- Luau accede a variables y funciones globales con una búsqueda de hash, por lo que es costoso de usar en términos de ejecución.El uso de una variable global en un ciclo crítico de tiempo puede hacer que se ejecute más del 10% más lento que usando una variable local en el mismo ciclo.
- Luau deshace las variables locales después de que termine su alcance, reduciendo el uso de memoria.
- Puedes acceder a variables y funciones globales dentro del mismo script, pero no entre múltiples scripts.Por lo tanto, una variable o función global no proporciona ningún beneficio sobre un equivalente local dentro del alcance, un valor superior o una sombra .
Alcance local
Luau solo puede acceder a una variable o función local en el bloque de código donde la declaras.Crear una variable con alcance local te da un control más estricto sobre cuándo y dónde cambia su valor.
En el siguiente código, la función testFunc() y la variable testVar tienen alcance local.Solo el código dentro de testFunc() puede acceder a la variable testVar.La variable testVar no tiene un valor fuera de testFunc() , por lo que llamar print(testVar) dentro de testFunc() imprime el valor de testVar , pero llamar print(testVar) fuera de testFunc() imprime nil .
local function testFunc() -- alcance local
local testVar = 64 -- alcance local
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
En el siguiente código, la variable local x tiene valor 0 en la línea 1.Como Luau itera a través del bucle , una variable local diferente tiene valor .Entonces, Luau imprime la variable inicial x con un valor no modificado 0 .
local x = 0 -- Variable local "x"for i = 1, 4 dolocal x = 1 -- Variable diferente "x", local a este bucle "para"print("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ Resultado de Salida:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
Capturar
Después de declarar y asignar una variable local, puedes leerla en su nivel de alcance y funciones cuyos alcances estén encerrados por el mismo alcance que contenga la variable local.Esta técnica se conoce como capturar .
En el siguiente código, la función f captura la variable local x.La variable x en f() es un valor superior .
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Sombra
Después de declarar y asignar una variable local, puedes leerla en su nivel de alcance y en los niveles de alcance descendente.Si redeclaras y reasignas la variable en un nivel de alcance descendiente, creas una nueva variable local con el mismo nombre pero con un valor diferente al de la asignación más anterior.La nueva variable local no afecta a la variable local de la asignación anterior.Esta técnica, conocida como sombreado , te ayuda a reutilizar el nombre de una variable sin volver a utilizar su valor.
En el siguiente código, Luau sombrea la variable . La variable en es una variable de sombra .
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
También puedes volver a declarar una variable local sin asignarle un valor para que puedas reasignar la variable en ambos niveles de alcance y niveles de alcance descendientes.Reasignar una variable local sin asignarle un valor la establece en nil .
En el siguiente código, Luau sombrea la variable local fruitName en la función getFruitByColor().La función redeclara fruitName como una nueva variable de sombra y establece su valor en nil .La función tiene un nivel de alcance descendiente, un for bucle , que asigna un valor a fruitName.Después del bucle for, la función devuelve la variable de sombra fruitName.A lo largo de toda la función, fruitName es la misma variable local que no reemplaza la variable inicial fruitName local.
local fruitName = "Chocolate"
local fruitTable = {
Lemon = "Yellow",
Apple = "Red",
Orange = "Orange"
}
local function getFruitByColor(color)
local fruitName
for key, value in fruitTable do
if value == color then
fruitName = key
end
end
return fruitName
end
local fruit = getFruitByColor("Yellow")
print(fruit) -- Limón
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate