En la programación, un bloque de código es el cuerpo de una estructura de control o 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 las variables y funciones globales. Un bloque puede acceder a las variables y funciones locales en su bloque padre, pero no en ninguno de sus bloques hijos.
Las variables y funciones tienen un alcance global por defecto, pero casi siempre es mejor declararlas con un alcance local porque Luau accede a las variables y funciones locales más rápido que a las globales. Para dar a una variable o función un alcance local, pon la palabra clave local antes de su nombre cuando la declares.
Los scripts no pueden acceder a variables o funciones globales y locales en otros scripts. Si deseas compartir valores y funciones entre scripts, usa ModuleScripts.
local helloWorld = '¡Hola Mundo!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- ¡Hola Mundo!

- 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 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 a testFunc(), asigna a testVar el valor 64. testVar tiene alcance global, por lo que la función print() fuera de testFunc() puede acceder a ella e imprimir 64.
Ejemplo de funciones y variables globales
local function testFunc() -- alcance local
testVar = 64 -- alcance global
end
testFunc()
print(testVar) -- 64
En el siguiente código, la variable global x comienza en 0, se incrementa en 1 con cada iteración del bucle for, y se imprime de nuevo después con un valor final de 4.
x = 0 -- Variable global "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ Salida resultante: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 las siguientes desventajas en comparación con las locales:
- Luau accede a las variables y funciones globales con una búsqueda hash, por lo que es costoso en términos de rendimiento. Usar una variable global en un bucle crítico de tiempo puede hacer que funcione más de un 10% más lento que usar una variable local en el mismo bucle.
- Luau elimina las variables locales después de que termina su alcance, reduciendo el uso de memoria.
Alcance local
Luau solo puede acceder a una variable o función local en el bloque de código donde la declares. 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 a print(testVar) dentro de testFunc() imprime el valor de testVar, pero llamar a 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 el valor 0 en la línea 1. A medida que Luau itera a través del bucle for, una variable local diferente x tiene el valor 1. Luego, Luau imprime la variable inicial x con un valor inalterado 0.
local x = 0 -- Variable local "x"for i = 1, 4 dolocal x = 1 -- Variable diferente "x", local a este "bucle for"print("Bucle 'x' = " .. x)endprint("Inicial 'x' = " .. x)--[[ Salida resultante:Bucle 'x' = 1Bucle 'x' = 1Bucle 'x' = 1Bucle 'x' = 1Inicial 'x' = 0]]
Captura
Después de declarar y asignar una variable local, puedes leerla en su nivel de alcance y en funciones cuyos alcances están contenidos por el mismo alcance que contiene la variable local. Esta técnica se conoce como captura.
En el siguiente código, la función f captura la variable local x. La variable x en f() es un upvalue.
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 niveles de alcance descendientes. Si vuelves a declarar y reasignar la variable en un nivel de alcance descendente, entonces creas una nueva variable local con el mismo nombre pero con un valor diferente de la última asignación. La nueva variable local no afecta la variable local de la asignación anterior. Esta técnica, conocida como sombreado, te ayuda a reutilizar el nombre de una variable sin reutilizar su valor.
En el siguiente código, Luau sombre la variable x. La variable x en f() 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 su nivel de alcance y en niveles de alcance descendentes. Volver a declarar una variable local sin asignarle un valor establece su valor en nil.
En el siguiente código, Luau sombrea la variable local fruitName en la función getFruitByColor(). La función vuelve a declarar fruitName como una nueva variable de sombra y establece su valor en nil. La función tiene un nivel de alcance descendente, un bucle for, 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 sobrescribe la variable local inicial fruitName.
local fruitName = "Chocolate"
local fruitTable = {
Limón = "Amarillo",
Manzana = "Rojo",
Naranja = "Naranja"
}
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("Amarillo")
print(fruit) -- Limón
print(fruit .. ", no " .. fruitName) -- Limón, no Chocolate