範圍

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

在腳本中,程式碼塊是 控制結構函數 的主體。變數或函數的 範圍 是可以訪問它的程式碼區塊,它可以是 全域區域。所有區塊都可以訪問全域變數和函數。區塊可以訪問其父區塊中的區域變數和函數,但不能訪問其子區塊中的任何變數和函數。

變數和函數預設具有全域範圍,但通常更好在宣告時使用區域範圍,因為 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

在以下程式碼中,全域變數 x0 開始,隨著每次迭代 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 以未更改的值 0 打印初始變數 x


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
]]

捕獲

在您宣告並賦值一個區域變數後,您可以在其範圍層級以及那些範圍在包含該區域變數的相同範圍內的函數中讀取該變數。這種技術稱為 捕獲

在以下程式碼中,函數 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
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。