ในการเขียนสคริปต์ บล็อกของโค้ดคือเนื้อหาของ โครงสร้างควบคุม หรือ ฟังก์ชัน ขอบเขตของตัวแปรหรือฟังก์ชันคือบล็อกของโค้ดที่สามารถเข้าถึงมันได้ และมันสามารถเป็น ระดับโลก หรือ ท้องถิ่น บล็อกทั้งหมดสามารถเข้าถึงตัวแปรและฟังก์ชันระดับโลกได้ บล็อกสามารถเข้าถึงตัวแปรและฟังก์ชันท้องถิ่นในบล็อกผู้ปกครอง แต่ไม่สามารถเข้าถึงในบล็อกลูกใด ๆ ของมันได้
ตัวแปรและฟังก์ชันจะมีขอบเขตระดับโลกโดยค่าเริ่มต้น แต่เกือบจะดีกว่าหากประกาศพวกเขาด้วยขอบเขตท้องถิ่นเพราะ 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 มีขอบเขตระดับโลก ดังนั้นฟังก์ชัน print() ภายนอก testFunc() สามารถเข้าถึงมันและพิมพ์ 64
ตัวอย่างของฟังก์ชันและตัวแปรระดับโลก
local function testFunc() -- ขอบเขตท้องถิ่น
testVar = 64 -- ขอบเขตระดับโลก
end
testFunc()
print(testVar) -- 64
ในโค้ดต่อไปนี้ ตัวแปรระดับโลก x เริ่มต้นที่ 0 เพิ่มขึ้น 1 ในแต่ละรอบของ for loop และพิมพ์อีกครั้งภายหลังด้วยค่าสุดท้ายเป็น 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 มีค่า 0 ที่บรรทัด 1 ขณะที่ Luau ทำการวนซ้ำใน for loop ตัวแปรท้องถิ่นที่แตกต่าง 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() เป็น upvalue
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 loop ที่ตั้งค่าตัวแปร 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