스크립팅에서 코드 블록은 제어 구조 또는 함수의 본체입니다.변수나 함수의 범위 는 액세스할 수 있는 코드 블록이며, 전역 또는 로컬 일 수 있습니다.모든 블록은 전역 변수와 함수에 액세스할 수 있습니다.블록은 부모 블록에서 로컬 변수와 함수에 액세스할 수 있지만, 자식 블록 중 어느 것도 액세스할 수 없습니다.
변수와 함수는 기본적으로 전역 범위를 갖지만, Luau가 전역 변수와 함수보다 로컬 변수와 함수에 더 빠르게 액세스하기 때문에 항상 로컬 범위로 선언하는 것이 좋습니다.변수나 함수에 지역 범위를 제공하려면 선언할 때 키워드 local를 이름 앞에 넣으십시오.
스크립트는 다른 스크립트의 전역 및 로컬 변수 또는 함수에 액세스할 수 없습니다.스크립트 간에 값과 함수를 공유하려면 ModuleScripts를 사용하십시오.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- 블록 B 는 블록 A의 로컬 변수에 액세스할 수 있습니다.
- 블록 C 는 블록 A와 B의 로컬 변수와 함수에 액세스할 수 있습니다
- 블록 A 는 블록 B 또는 C의 로컬 변수와 함수에 액세스할 수 없습니다. * 블록 B 는 블록 C의 로컬 변수에 액세스할 수 없습니다.
전역 범위
전역 변수나 함수를 선언한 후, 동일한 스크립트의 코드 블록에서 액세스할 수 있습니다.변수와 함수는 local 키워드로 선언하지 않으면 전역 범위에 있습니다.
다음 코드에서 testVar는 로컬 testFunc() 함수 내에서 전역 범위를 가집니다.Luau가 를 호출하면, 값 을 할당합니다. 는 전역 범위를 가지므로 외부의 함수가 액세스하고 출력할 수 있습니다 .
Example of global functions and variables
local function testFunc() -- 로컬 범위
testVar = 64 -- 전역 범위
end
testFunc()
print(testVar) -- 64
다음 코드에서 전역 변수 는 에서 시작하여 의 각 반복으로 증가하고, 마지막으로 4의 최종 값으로 다시 인쇄합니다.
x = 0 -- 전역 변수 "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ 결과 출력:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
전역 변수와 함수를 선언하는 것이 훨씬 쉬워지기 때문에 입력할 필요가 적지만 전역 변수와 함수는 다음과 같은 단점이 있습니다.
- Luau는 해시 검색을 통해 전역 변수와 함수에 액세스하므로 이행측면에서 사용하기 비용이 많이 듭니다.시간 민감한 루프에서 전역 변수를 사용하면 동일한 루프에서 지역 변수를 사용하는 것보다 10% 이상 느려질 수 있습니다.
- 루오는 범위가 끝난 후 로컬 변수를 처리하여 메모리 사용량을 줄입니다.
- 같은 스크립트 내에서 전역 변수와 함수에 액세스할 수 있지만, 여러 스크립트 간에는 액세스할 수 없습니다.따라서 전역 변수나 함수는 범위 내 로컬 동등, 업밸브, 또는 그림자에 대해 아무런 이점을 제공하지 않습니다.
로컬 범위
Luau는 코드 블록에서 선언한 로컬 변수나 함수에만 액세스할 수 있습니다.로컬 범위의 변수를 만들면 값이 언제 어디에서 변경되는지에 대한 더 엄격한 제어를 얻을 수 있습니다.
다음 코드에서 testFunc() 함수와 testVar 변수는 로컬 범위를 가집니다.testFunc() 내의 코드만 변수 testVar에 액세스할 수 있습니다.변수 는 값이 없으므로 내에서 호출하면 의 값이 인쇄되지만, 외부에서 호출하면 의 값이 인쇄됩니다.
local function testFunc() -- 로컬 범위
local testVar = 64 -- 로컬 범위
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
다음 코드에서 로컬 변수 x 는 줄 1에서 값 0 을 가지고 있습니다.Luau가 루프를 반복하면서, 다른 로컬 변수 의 값이 됩니다.그런 다음 Luau는 변경되지 않은 값 x 으로 초기 변수 0 를 인쇄합니다.
local x = 0 -- 로컬 변수 "x"for i = 1, 4 dolocal x = 1 -- 이 "for" 루프에 로컬인 다른 변수 "x"print("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ 결과 출력:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
캡처
로컬 변수를 선언하고 할당한 후에는 범위 수준에서 해당 범위를 포함하는 동일한 범위의 함수와 로컬 변수의 범위가 포함된 함수를 읽을 수 있습니다.이 기술은 캡처 라고 합니다.
다음 코드에서 함수 f 는 로컬 변수 x 를 캡처합니다.변수 는 에서 상위 값입니다.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
그림자
로컬 변수를 선언하고 할당한 후에는 범위 수준과 하위 범위 수준에서 읽을 수 있습니다.하위 레벨범위에서 변수를 재정의하고 다시 할당하면 가장 이전 할당과 동일한 이름을 가진 새로운 로컬 변수를 만들지만 값은 다릅니다.새로운 지역 변수는 이전 할당에서 지역 변수에 영향을 주지 않습니다.이 기술, 섀도잉 이라고 알려져 있습니다, 값을 재사용하지 않고 변수의 이름을 다시 사용하도록 도와줍니다.
다음 코드에서 Luau는 변수 x 을 그림자로 합니다. 변수 x 는 f() 에서 변수 그림자 입니다.
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
값을 할당하지 않고 로컬 변수를 다시 선언하여 범위 수준과 하위 범위 수준 모두에서 변수를 다시 할당할 수 있습니다.값을 할당하지 않고 로컬 변수를 다시 선언하면 값이 nil로 설정됩니다.
다음 코드에서 Luau는 함수 getFruitByColor() 에서 로컬 변수 fruitName를 그림자로 합니다.함수는 새로운 쉐도우 변수로 fruitName 을 재정의하고 값을 nil 으로 설정합니다.함수에는 하위 범위 레벨, for 루프 , 값을 할당하는 fruitName 가 있습니다.for 루프 후, 함수는 fruitName 그림자 변수를 반환합니다.전체 함수 내내 fruitName 는 초기 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) -- 레몬
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate