Phạm vi

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Trong lập trình, một khối mã là thân của một cấu trúc điều khiển hoặc hàm. Phạm vi của một biến hoặc hàm là khối mã có thể truy cập nó, và nó có thể là toàn cục hoặc cục bộ. Tất cả các khối có thể truy cập các biến và hàm toàn cục. Một khối có thể truy cập các biến và hàm cục bộ trong khối cha của nó, nhưng không trong bất kỳ khối con nào của nó.

Các biến và hàm có phạm vi toàn cục theo mặc định, nhưng hầu như luôn tốt hơn khi khai báo chúng với phạm vi cục bộ vì Luau truy cập các biến và hàm cục bộ nhanh hơn so với các biến toàn cục. Để cho một biến hoặc hàm có phạm vi cục bộ, hãy đặt từ khóa local trước tên của nó khi bạn khai báo.

Các script không thể truy cập các biến hoặc hàm toàn cục và cục bộ trong các script khác. Nếu bạn muốn chia sẻ giá trị và hàm giữa các script, hãy sử dụng ModuleScripts.

local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
  • Khối B có thể truy cập biến cục bộ trong khối A.
  • Khối C có thể truy cập các biến và hàm cục bộ trong các khối A và B.
  • Khối A không thể truy cập các biến và hàm cục bộ trong các khối B hoặc C.
  • Khối B không thể truy cập biến cục bộ trong khối C.

Phạm vi toàn cục

Sau khi bạn khai báo một biến hoặc hàm toàn cục, bất kỳ khối mã nào trong cùng một script có thể truy cập nó. Các biến và hàm có phạm vi toàn cục trừ khi bạn khai báo chúng với từ khóa local.

Trong đoạn mã sau, testVar có phạm vi toàn cục trong hàm cục bộ testFunc(). Khi Luau gọi testFunc(), nó gán cho testVar giá trị 64. testVar có phạm vi toàn cục, vì vậy hàm print() bên ngoài testFunc() có thể truy cập nó và in ra 64.

Ví dụ về các hàm và biến toàn cục
local function testFunc() -- phạm vi cục bộ
testVar = 64 -- phạm vi toàn cục
end
testFunc()
print(testVar) -- 64

Trong đoạn mã sau, biến toàn cục x bắt đầu với giá trị 0, tăng lên 1 với mỗi lần lặp của vòng lặp for, và in ra một lần nữa sau đó với giá trị cuối cùng là 4.

x = 0 -- Biến toàn cục "x"
for i = 1, 4 do
x += 1
print("Toàn cục 'x' = " .. x)
end
print("Toàn cục 'x' = " .. x)
--[[ Kết quả đầu ra:
Toàn cục 'x' = 1
Toàn cục 'x' = 2
Toàn cục 'x' = 3
Toàn cục 'x' = 4
Toàn cục 'x' = 4
]]

Việc khai báo các biến và hàm toàn cục dễ hơn vì bạn không cần phải gõ nhiều, nhưng các biến và hàm toàn cục có những nhược điểm sau so với các biến cục bộ:

  • Luau truy cập các biến và hàm toàn cục bằng cách tìm kiếm băm, vì vậy nó tốn kém về hiệu suất. Việc sử dụng một biến toàn cục trong một vòng lặp quan trọng về thời gian có thể làm cho nó chậm hơn hơn 10% so với việc sử dụng một biến cục bộ trong cùng một vòng lặp.
  • Luau giải phóng các biến cục bộ sau khi phạm vi của chúng kết thúc, giảm mức sử dụng bộ nhớ.
  • Bạn có thể truy cập các biến và hàm toàn cục trong cùng một script, nhưng không giữa nhiều script. Do đó, một biến hoặc hàm toàn cục không cung cấp bất kỳ lợi ích nào so với một biến cục bộ trong phạm vi, một upvalue, hoặc một shadow.

Phạm vi cục bộ

Luau chỉ có thể truy cập một biến hoặc hàm cục bộ trong khối mã nơi bạn khai báo nó. Việc tạo một biến với phạm vi cục bộ giúp bạn kiểm soát chặt chẽ hơn về khi nào và ở đâu giá trị của nó thay đổi.

Trong đoạn mã sau, hàm testFunc() và biến testVar có phạm vi cục bộ. Chỉ có mã trong testFunc() có thể truy cập biến testVar. Biến testVar không có giá trị bên ngoài testFunc(), vì vậy việc gọi print(testVar) trong testFunc() in ra giá trị của testVar, nhưng việc gọi print(testVar) bên ngoài testFunc() in ra nil.

local function testFunc() -- phạm vi cục bộ
local testVar = 64 -- phạm vi cục bộ
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil

Trong đoạn mã sau, biến cục bộ x có giá trị 0 tại dòng 1. Khi Luau lặp qua vòng lặp for, một biến cục bộ khác x có giá trị 1. Sau đó, Luau in ra biến ban đầu x với giá trị không thay đổi là 0.

local x = 0 -- Biến cục bộ "x"
for i = 1, 4 do
local x = 1 -- Biến khác "x", cục bộ cho vòng lặp "for" này
print("Vòng lặp 'x' = " .. x)
end
print("Ban đầu 'x' = " .. x)
--[[ Kết quả đầu ra:
Vòng lặp 'x' = 1
Vòng lặp 'x' = 1
Vòng lặp 'x' = 1
Vòng lặp 'x' = 1
Ban đầu 'x' = 0
]]

Các biến và hàm const tuân theo cùng một quy tắc phạm vi như các biến local. Bạn có thể khai báo chúng trong bất kỳ khối nào, bao gồm cả bên trong một hàm khác. Để biết thêm thông tin về const, xem Biến const.

Bắt

Sau khi bạn khai báo và gán một biến cục bộ, bạn có thể đọc nó trong cấp độ phạm vi của nó và các hàm có phạm vi được bao bọc bởi cùng một phạm vi chứa biến cục bộ. Kỹ thuật này được gọi là bắt.

Trong đoạn mã sau, hàm f bắt biến cục bộ x. Biến x trong f() là một upvalue.

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

Bóng

Sau khi bạn khai báo và gán một biến cục bộ, bạn có thể đọc nó trong cấp độ phạm vi của nó và các cấp độ phạm vi con. Nếu bạn khai báo lại và gán lại biến trong một cấp độ phạm vi con, thì bạn tạo ra một biến cục bộ mới với cùng tên nhưng giá trị khác so với gán trước đó. Biến cục bộ mới không ảnh hưởng đến biến cục bộ từ gán trước đó. Kỹ thuật này, được gọi là bóng, giúp bạn tái sử dụng tên của một biến mà không tái sử dụng giá trị của nó.

Trong đoạn mã sau, Luau bóng biến x. Biến x trong f() là một biến bóng.

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

Bạn cũng có thể khai báo lại một biến cục bộ mà không gán giá trị cho nó để bạn có thể gán lại biến trong cả cấp độ phạm vi của nó và các cấp độ phạm vi con. Việc khai báo lại một biến cục bộ mà không gán giá trị cho nó sẽ đặt giá trị của nó thành nil.

Trong đoạn mã sau, Luau bóng biến cục bộ fruitName trong hàm getFruitByColor(). Hàm khai báo lại fruitName như một biến bóng mới và đặt giá trị của nó thành nil. Hàm có một cấp độ phạm vi con, một vòng lặp for, gán giá trị cho fruitName. Sau vòng lặp for, hàm trả về biến bóng fruitName. Trong toàn bộ hàm, fruitName là cùng một biến cục bộ không ghi đè lên biến cục bộ fruitName ban đầu.

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 .. ", không phải " .. fruitName) -- Lemon, không phải Chocolate
©2026 Roblox Corporation. Roblox, logo Roblox và Powering Imagination là các nhãn hiệu đã đăng ký và chưa đăng ký của chúng tôi tại Hoa Kỳ và các quốc gia khác.