在指令碼化中,一個代碼塊是 控制結構 或 功能 的體。變量或函數的 範圍 是可以存取它的代碼塊,可以是 全球 或 本地 。所有方塊都可以存取全球變量和功能。一個方塊可以在其父方磚塊中存取本地變量和功能,但不能在其子方塊中存取。
變數和函數的全球範圍默認為全球範圍,但使用本地範圍宣言它們幾乎總是更好的,因為 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 。 具有全球範圍,因此外部的 函數可以存取它並打印 。
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在範圍結束後清除本地變量,減少記憶使用。
本地範圍
Luau只能在你宣言它的代碼區塊中存取本地變量或功能。使用本地範圍創建變量可讓您更精確地控制值何時何地變更。
在下面的代碼中,testFunc() 功能和 testVar 變量有本地範圍。只有 testFunc() 內的代碼才能存取 testVar 變量。變量 testVar 沒有值在 testFunc() 之外,因此呼叫 print(testVar) 在 testFunc() 內打印 testVar 值,但呼叫 print(testVar) 在 testFunc() 外打印 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 dolocal x = 1 -- 不同變量「x」,本地於此「for」迴圈print("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ 結果輸出:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
捕獲
宣言並配置本地變量後,您可以在其範圍等級和包含本地變量的範圍的函數中閱讀它。這種技術被稱為 捕捉 。
在下面的代碼中,函數 f 捕捉了本地變量 x 。變量 x 在 f() 是一個 上值 。
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 陰影了本地變量 fruitName 在函數 getFruitByColor() 中。函數重新宣言 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