W skryptowaniu blok kodu jest ciałem struktury kontroli lub funkcji .Zakres zmiennej lub funkcji to blok kodu, który może do niej uzyskać dostęp, i może to być globalny lub lokalny .Wszystkie bloki mogą uzyskiwać dostęp do globalnych zmiennych i funkcji.Blok może uzyskiwać lokalne zmienne i funkcje w bloku rodzicznym, ale nie w żadnym z jego dziecięcych bloków.
Zmienne i funkcje mają globalny zakres domyślnie, ale prawie zawsze lepiej je deklarować z lokalnym zakresem, ponieważ Luau uzyskuje dostęp do lokalnych zmiennych i funkcji szybciej niż globalne.Aby dać zmiennej lub funkcji lokalny zakres, umieść klucz local przed jej nazwą, gdy ją deklarujesz.
Skrypty nie mogą uzyskiwać globalnych i lokalnych zmiennych lub funkcji w innych skryptach.Jeśli chcesz udostępniać wartości i funkcje między skryptami, użyj ModuleScripts.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- Blok B może uzyskać dostęp do zmiennej lokalnej w bloku A.
- Blok C może uzyskać dostęp do lokalnych zmiennych i funkcji w blokach A i B.
- Blok A nie może uzyskać dostęp do lokalnych zmiennych i funkcji w blokach B lub C.
- Blok B nie może uzyskać dostęp do zmiennej lokalnej w bloku C.
Globalny zakres
Po zadeklarowaniu globalnej zmiennej lub funkcji każdy blok kodu w tym samym skrypcie może do niej uzyskać dostęp.Zmienne i funkcje mają globalny zakres, chyba że oznaczysz je kluczową local ładowaniem.
W następnym kodzie testVar ma globalny zakres w lokalnej funkcji testFunc().Kiedy Luau dzwoni do testFunc(), przypisuje testVar wartość 64.Funkcja testVar ma globalny zakres, więc funkcja print() poza testFunc() może do niej uzyskać dostęp i wydrukować 64 .
Example of global functions and variables
local function testFunc() -- lokalny zakres
testVar = 64 -- ogólnoświatowy zakres
end
testFunc()
print(testVar) -- 64
W następnym kodzie zmienna globalna rozpoczyna się od , zwiększa o za każdym razem, gdy powtarza się pętla , a następnie drukuje ponownie z ostateczną wartością 4.
x = 0 -- Globalna zmienna "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ Wynikowe wyjście:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
Łatwiej jest deklarować globalne zmienne i funkcje, ponieważ nie musisz tak wiele pisać, ale globalne zmienne i funkcje mają następujące wady w porównaniu z lokalnymi:
- Luau uzyskuje globalne zmienne i funkcje za pomocą wyszukiwania hasha, więc jest drogie w użyciu pod względem wykonywanie.Użycie globalnej zmiennej w pętlu krytycznym czasowo może sprawić, że wykonuje się o ponad 10% wolniej niż używanie lokalnej zmiennej w tym samym pętlu.
- Luau usuwa lokalne zmienne po zakończeniu ich zakresu, zmniejszając zużycie pamięci.
- Możesz uzyskać dostęp do globalnych zmiennych i funkcji w tym samym skrypcie, ale nie między wieloma skryptami.Dlatego globalna zmienna lub funkcja nie zapewnia żadnych korzyści nad lokalnym odpowiednikiem w zakresie, wartością powrotną lub cieniem .
Lokalny zakres
Luau może uzyskać dostęp tylko do lokalnej zmiennej lub funkcji w bloku kodu, w którym ją deklarujesz.Tworzenie zmiennej z lokalnym zakresem daje Ci większą kontrolę nad tym, kiedy i gdzie zmienia się jej wartość.
W następnym kodzie funkcja testFunc() i zmienna testVar mają lokalny zakres.Tylko kod w granicach testFunc() może uzyskać dostęp do zmiennej testVar.变量 testVar nie ma wartości poza testFunc() , więc wezwanie print(testVar) wewnątrz testFunc() drukuje wartość testVar , ale wezwanie print(testVar) poza testFunc() drukuje nil .
local function testFunc() -- lokalny zakres
local testVar = 64 -- lokalny zakres
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
W następnym kodzie zmienna lokalna x ma wartość 0 na linii 1.W miarę powtarzania się pętla Luau, inna lokalna zmienna ma wartość .Następnie Luau drukuje początkową zmienną x z niezmienioną wartością 0.
local x = 0 -- Lokalna zmienna "x"for i = 1, 4 dolocal x = 1 -- Różna zmienna "x", lokalna do tego cyklu "for"print("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ Wynikowe wyjście:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
Przechwyć
Po zadeklarowaniu i przypisaniu lokalnej zmiennej możesz ją odczytać na poziomie zakresu i funkcjach, których zakres jest ograniczony przez ten sam zakres zawierający lokalną zmienną.Ta technika jest znana jako przechwytywanie .
W następnym kodzie funkcja f przechwytuje lokalną zmienną x.Zmienna x w f() jest wartością w górę .
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
Cień
Po zadeklarowaniu i przypisaniu lokalnej zmiennej możesz ją odczytać na poziomie zakresu i poziomach zakresu podrzędnych.Jeśli ponownie zadeklarujesz i przypiszesz zmienną w poziomie podrzędnego zakresu, stworzysz nową lokalną zmienną o tej samej nazwie, ale o innym wartości od najbardziej poprzedniej przypisu.Nowa lokalna zmienna nie wpływa na zmienną lokalną z poprzedniego przypisania.Ta technika, znana jako shadowing , pomaga ci ponownie używać nazwy zmiennej bez ponownego używania jej wartości.
W następnym kodzie Luau cieniuje zmienną . Zmienna w jest zmienną cieniem .
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
Możesz również ponownie zadeklarować lokalną zmienną bez przypisania jej wartości, abyś mógł ponownie przypisać zmienną na poziomie jej zakresu i poziomach podrzędnych.Odnowienie lokalnej zmiennej bez przypisania jej wartości ustawia jej wartość na nil .
W następnym kodzie Luau cieniuje lokalną zmienną fruitName w funkcji getFruitByColor().Funkcja ponownie deklaruje fruitName jako nową zmienną cienia i ustawia jej wartość na nil .Funkcja ma poziom zakresu potomnego, pętla , która przypisuje wartość do .Po pętlu for funkcja zwraca zmienną cienia fruitName.Przez całą funkcję fruitName jest tą samą lokalną zmienną, która nie zastępuje początkowej lokalnej zmiennej 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) -- Cytryna
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate