在脚本编写中,代码块是控制结构或函数的主体。变量或函数的范围是可以访问它的代码块,它可以是全局的或局部的。所有代码块都可以访问全局变量和函数。一个代码块可以访问其父代码块中的局部变量和函数,但不能访问其子代码块中的任何内容。
变量和函数默认具有全局范围,但几乎总是更好地声明它们为局部范围,因为 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
在以下代码中,全局变量 x 从 0 开始,在每次迭代中递增 1,并在之后再次打印,最终值为 4。
x = 0 -- 全局变量 "x"for i = 1, 4 dox += 1print("全局 'x' = " .. x)endprint("全局 '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 dolocal x = 1 -- 不同的变量 "x",局部于此 "for" 循环print("循环 'x' = " .. x)endprint("初始 '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