스크립팅에서 코드 블록은 제어 구조 또는 함수의 본체입니다. 변수 또는 함수의 범위는 이를 접근할 수 있는 코드 블록이며, 전역 또는 지역일 수 있습니다. 모든 블록은 전역 변수와 함수에 접근할 수 있습니다. 블록은 부모 블록의 지역 변수와 함수에 접근할 수 있지만, 자식 블록의 지역 변수와 함수에는 접근할 수 없습니다.
변수와 함수는 기본적으로 전역 범위를 가지지만, 지역 범위로 선언하는 것이 거의 항상 더 좋습니다. 왜냐하면 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가 testFunc()를 호출할 때, testVar에 값 64를 할당합니다. testVar는 전역 범위를 가지므로, testFunc() 외부의 print() 함수가 이를 접근하여 64를 출력할 수 있습니다.
local function testFunc() -- 지역 범위
testVar = 64 -- 전역 범위
end
testFunc()
print(testVar) -- 64다음 코드에서 전역 변수 x는 0에서 시작하여 for 루프의 각 반복마다 1씩 증가하며, 마지막 값 4로 다시 출력됩니다.
x = 0 -- 전역 변수 "x"
for i = 1, 4 do
x += 1
print("전역 'x' = " .. x)
end
print("전역 'x' = " .. x)
--[[ 결과 출력:
전역 'x' = 1
전역 'x' = 2
전역 'x' = 3
전역 'x' = 4
전역 'x' = 4
]]전역 변수와 함수를 선언하는 것은 더 쉽습니다. 왜냐하면 입력해야 할 내용이 적기 때문입니다. 그러나 전역 변수와 함수는 지역 변수에 비해 다음과 같은 단점이 있습니다:
- Luau는 해시 조회를 통해 전역 변수와 함수에 접근하므로 성능 측면에서 비용이 많이 듭니다. 시간에 민감한 루프에서 전역 변수를 사용하면 동일한 루프에서 지역 변수를 사용하는 것보다 10% 이상 느려질 수 있습니다.
- Luau는 지역 변수가 범위가 끝난 후 메모리를 해제하여 메모리 사용량을 줄입니다.
지역 범위
Luau는 선언한 코드 블록 내에서만 지역 변수 또는 함수에 접근할 수 있습니다. 지역 범위로 변수를 생성하면 값이 변경되는 시점과 위치를 더 엄격하게 제어할 수 있습니다.
다음 코드에서 testFunc() 함수와 testVar 변수는 지역 범위를 가집니다. 오직 testFunc() 내의 코드만 testVar 변수에 접근할 수 있습니다. testVar 변수는 testFunc() 외부에서 값이 없으므로, testFunc() 내에서 print(testVar)를 호출하면 testVar의 값을 출력하지만, testFunc() 외부에서 print(testVar)를 호출하면 nil을 출력합니다.
local function testFunc() -- 지역 범위
local testVar = 64 -- 지역 범위
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil다음 코드에서 지역 변수 x는 1행에서 값 0을 가집니다. Luau가 for 루프를 반복하면서 다른 지역 변수 x는 값 1을 가집니다. 그런 다음 Luau는 초기 변수 x를 변경되지 않은 값 0으로 출력합니다.
local x = 0 -- 지역 변수 "x"
for i = 1, 4 do
local x = 1 -- 다른 변수 "x", 이 "for" 루프에 지역적
print("루프 'x' = " .. x)
end
print("초기 'x' = " .. x)
--[[ 결과 출력:
루프 'x' = 1
루프 'x' = 1
루프 'x' = 1
루프 'x' = 1
초기 'x' = 0
]]const 변수와 함수는 local 변수와 동일한 범위 규칙을 따릅니다. 이들은 다른 함수 내에서도 포함된 블록에서 선언할 수 있습니다. const에 대한 자세한 내용은 Const 변수를 참조하십시오.
캡처
지역 변수를 선언하고 할당한 후, 해당 범위 수준과 지역 변수를 포함하는 같은 범위의 함수에서 이를 읽을 수 있습니다. 이 기술은 캡처라고 합니다.
다음 코드에서 함수 f는 지역 변수 x를 캡처합니다. f() 내의 변수 x는 업값입니다.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5섀도우
지역 변수를 선언하고 할당한 후, 해당 범위 수준과 자손 범위 수준에서 이를 읽을 수 있습니다. 자손 범위 수준에서 변수를 재선언하고 재할당하면, 가장 최근의 할당과는 다른 값을 가진 동일한 이름의 새로운 지역 변수를 생성합니다. 새로운 지역 변수는 이전 할당의 지역 변수에 영향을 미치지 않습니다. 이 기술은 섀도우링이라고 하며, 변수의 이름을 재사용하면서 값은 재사용하지 않도록 도와줍니다.
다음 코드에서 Luau는 변수 x를 섀도우합니다. f() 내의 변수 x는 섀도우 변수입니다.
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) -- Lemon
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate