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 kiểu điều khiển hoặc chức năng .Phạm vi của một biến hoặc chức năng là khối mã có thể truy cập nó, và nó có thể là toàn cầu hoặc địa phương .Tất cả các khối có thể truy cập các biến và chức năng toàn cầu.Một khối có thể truy cập các biến và chức năng địa phương trong khối cha của nó, nhưng không trong bất kỳ khối con nào.

Biến và chức năng có phạm vi toàn cầu mặc định, nhưng hầu như luôn tốt hơn khi tuyên bố chúng với phạm vi địa phương bởi vì Luau truy cập các biến và chức năng địa phương nhanh hơn các biến và chức năng toàn cầu.Để cung cấp phạm vi biến hoặc chức năng địa phương, hãy đặt từ khóa local trước tên của nó khi bạn tuyên bố nó.

Các kịch bản không thể truy cập các biến và chức năng toàn cầu và địa phương trong các kịch bản khác.Nếu bạn muốn chia sẻ giá trị và chức năng giữa các kịch bản, 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 địa phương trong khối A.
  • Khối C có thể truy cập các biến và chức năng địa phương trong các khối A và B.
  • Khối A không thể truy cập các biến và chức năng địa phương trong khối B hoặc C.
  • Khối B không thể truy cập biến địa phương trong khối C.

Phạm vi toàn cầu

Sau khi bạn tuyên bố một biến toàn cầu hoặc chức năng, bất kỳ khối mã nào trong cùng một tập lệnh có thể truy cập nó.Biến và chức năng có phạm vi toàn cầu trừ khi bạn tuyên bố chúng với từ khóa local.

Trong mã sau, testVar có phạm vi toàn cầu trong chức năng địa phương testFunc() .Khi Luau gọi , nó gán giá trị cho nó.Các testVar có phạm vi toàn cầu, vì vậy chức năng print() bên ngoài testFunc() có thể truy cập và in 64 .

Example of global functions and variables

local function testFunc() -- phạm vi địa phương
testVar = 64 -- phạm vi toàn cầu
end
testFunc()
print(testVar) -- 64

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


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

Dễ dàng tuyên bố các biến và chức năng toàn cầu hơn vì bạn không cần phải nhập nhiều, nhưng các biến và chức năng toàn cầu có những nhược điểm sau so với các biến và chức năng địa phương:

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

Phạm vi địa phương

Luau chỉ có thể truy cập một biến hoặc chức năng địa phương trong khối mã nơi bạn tuyên bố nó.Tạo một biến với phạm vi địa phương cho bạn kiểm soát chặt chẽ hơn về thời gian và nơi mà giá trị của nó thay đổi.

Trong mã sau, chức năng testFunc()testVar biến có phạm vi địa phương.Chỉ 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 gọi print(testVar) bên trong testFunc() in ra giá trị của testVar , nhưng gọi print(testVar) bên ngoài testFunc() in ra nil .


local function testFunc() -- phạm vi địa phương
local testVar = 64 -- phạm vi địa phương
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil

Trong mã sau, biến địa phương x có giá trị 0 ở dòng 1.Khi Luau lặp qua vòng lặp , một biến địa phương khác có giá trị .Sau đó, Luau in biến ban đầu x với giá trị không thay đổi 0 .


local x = 0 -- Biến địa phương "x"
for i = 1, 4 do
local x = 1 -- Biến khác "x", địa phương cho vòng lặp "for" này
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ Kết quả ra:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

Thu nhập

Sau khi bạn tuyên bố và gán một biến địa phương, bạn có thể đọc nó trong cấp độ phạm vi và chức năng có phạm vi bị bao bọc bởi cùng một phạm vi chứa biến địa phương.Phương pháp này được biết đến như cướp .

Trong mã sau, chức năng f bắt giữ biến địa phương x .Biến x trong f() là một giá trị tăng .


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

Bóng tối

Sau khi bạn tuyên bố và gán một biến địa phương, bạn có thể đọc nó trong cấp độ phạm vi và cấp độ phạm vi con.Nếu bạn tuyên bố lại và chuyển đổi biến trong cấp độ phạm vi con, then bạn tạo một biến địa phương mới với cùng tên nhưng giá trị khác từ phân bổ trước đó nhất.Biến địa phương mới không ảnh hưởng đến biến địa phương từ phân công trước.Kỹ thuật này, được gọi là bóng tối , 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 mã sau, Luau bóng tối biến x . Biến x trong f() là một biến bóng tối .


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

Bạn cũng có thể tuyên bố lại một biến địa phương mà không gán giá trị cho nó để bạn có thể chuyển lại biến trong cả cấp độ phạm vi và cấp độ phạm vi con.Tuyên bố lại một biến địa phương mà không gán giá trị cho nó đặt giá trị của nó thành nil .

Trong mã sau, Luau bóng tối biến địa phương fruitName trong chức năng getFruitByColor() .Chức năng tuyên bố lại fruitName như một biến bóng mới và đặt giá trị của nó thành nil .Chức năng có một cấp độ phạm vi con, một for vòng lặp , được gán một giá trị cho fruitName .Sau vòng lặp for, chức năng trả về biến đổi bóng fruitName .Trong suốt toàn bộ chức năng, fruitName là cùng một biến địa phương tương tự không ghi đè lên biến địa phương ban đầu 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) -- Chanh
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate