範圍

*此內容是使用 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 的值設置為 64testVar 具有全域範圍,因此 print() 函數在 testFunc() 外部可以訪問它並打印 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 打印初始變數 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 的更多信息,請參見常數變數

捕獲

在您聲明並賦值給區域變數後,您可以在其範圍級別及其範圍被包含在同一範圍中的函數中讀取它。這種技術稱為捕獲

在以下代碼中,函數 f 捕獲了區域變數 xf() 中的變數 x 是一個上值

local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5

影子

在您聲明並賦值給區域變數後,您可以在其範圍級別和後代範圍級別中讀取它。如果您在後代範圍級別中重新聲明並重新賦值該變數,則會創建一個具有相同名稱但與上一次賦值不同值的新區域變數。新的區域變數不會影響上一次賦值的區域變數。這種技術稱為影子,幫助您重用變數的名稱而不重用其值。

在以下代碼中,Luau 影子變數 xf() 中的變數 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 是我們在美國及其他國家地區的部分註冊與未註冊商標。