Em scripting, um bloco de código é o corpo de uma estrutura de controle ou função. O escopo de uma variável ou função é o bloco de código que pode acessá-la, e ele pode ser global ou local. Todos os blocos podem acessar variáveis e funções globais. Um bloco pode acessar variáveis e funções locais em seu bloco pai, mas não em nenhum de seus blocos filhos.
Variáveis e funções têm escopo global por padrão, mas é quase sempre melhor declará-las com escopo local porque Luau acessa variáveis e funções locais mais rápido do que globais. Para dar a uma variável ou função escopo local, coloque a palavra-chave local antes de seu nome ao declará-la.
Scripts não podem acessar variáveis ou funções globais e locais em outros scripts. Se você quiser compartilhar valores e funções entre scripts, use ModuleScripts.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- O bloco B pode acessar a variável local no bloco A.
- O bloco C pode acessar as variáveis e funções locais nos blocos A e B.
- O bloco A não pode acessar as variáveis e funções locais nos blocos B ou C.
- O bloco B não pode acessar a variável local no bloco C.
Escopo global
Depois de declarar uma variável ou função global, qualquer bloco de código no mesmo script pode acessá-lo. Variáveis e funções têm escopo global, a menos que você as declare com a palavra-chave local.
No código a seguir, testVar tem escopo global dentro da função local testFunc(). Quando Luau chama a testFunc(), ele atribui testVar o valor 64. A testVar tem escopo global, então a função print() fora de testFunc() pode acessá-la e imprimir 64.
Exemplo de funções e variáveis globais
local function testFunc() -- escopo local
testVar = 64 -- escopo global
end
testFunc()
print(testVar) -- 64
No código a seguir, a variável global x começa em 0, incrementa em 1 a cada iteração do for loop e imprime novamente após, com um valor final de 4.
x = 0 -- Variável global "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ Saída resultante:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
É mais fácil declarar variáveis e funções globais porque você não precisa digitar tanto, mas variáveis e funções globais têm as seguintes desvantagens em comparação com as locais:
- Luau acessa variáveis e funções globais com uma pesquisa hash, então é custoso em termos de desempenho. Usar uma variável global em um loop crítico de tempo pode torná-lo mais de 10% mais lento do que usar uma variável local no mesmo loop.
- Luau elimina variáveis locais após o término de seu escopo, reduzindo o uso de memória.
Escopo local
Luau só pode acessar uma variável ou função local no bloco de código onde você a declara. Criar uma variável com escopo local proporciona um controle mais rigoroso sobre quando e onde seu valor muda.
No código a seguir, a função testFunc() e a variável testVar têm escopo local. Apenas o código dentro de testFunc() pode acessar a variável testVar. A variável testVar não tem um valor fora de testFunc(), então chamar print(testVar) dentro de testFunc() imprime o valor de testVar, mas chamar print(testVar) fora de testFunc() imprime nil.
local function testFunc() -- escopo local
local testVar = 64 -- escopo local
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
No código a seguir, a variável local x tem o valor 0 na linha 1. Enquanto Luau itera pelo for loop, uma variável local diferente x tem o valor 1. Então, Luau imprime a variável inicial x com o valor inalterado 0.
local x = 0 -- Variável local "x"for i = 1, 4 dolocal x = 1 -- Variável diferente "x", local para este "for" loopprint("Loop 'x' = " .. x)endprint("Inicial 'x' = " .. x)--[[ Saída resultante:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Inicial 'x' = 0]]
Captura
Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de escopo e em funções cujo escopo é encerrado pelo mesmo escopo que contém a variável local. Essa técnica é conhecida como captura.
No código a seguir, a função f captura a variável local x. A variável x em f() é um upvalue.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Sombra
Depois de declarar e atribuir uma variável local, você pode lê-la em seu nível de escopo e níveis de escopo descendentes. Se você red declarar e reatribuir a variável em um nível de escopo descendente, você cria uma nova variável local com o mesmo nome, mas valor diferente da atribuição anterior. A nova variável local não afeta a variável local da atribuição anterior. Essa técnica, conhecida como sombreamento, ajuda você a reutilizar o nome de uma variável sem reutilizar seu valor.
No código a seguir, Luau sombra a variável x. A variável x em f() é uma variável de sombra.
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
Você também pode red declarar uma variável local sem atribuir um valor a ela para que possa reatribuir a variável em ambos os níveis de escopo e níveis de escopo descendentes. Red declarar uma variável local sem atribuir um valor a ela define seu valor como nil.
No código a seguir, Luau sombra a variável local fruitName na função getFruitByColor(). A função red declara fruitName como uma nova variável de sombra e define seu valor como nil. A função possui um nível de escopo descendente, um for loop, que atribui um valor a fruitName. Após o loop, a função retorna a variável de sombra fruitName. Ao longo de toda a função, fruitName é a mesma variável local que não sobrepõe a variável local inicial fruitName.
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) -- Lemon
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate