范围

*此内容使用人工智能(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() 时,它将分配 testVar64 。 具有全球范围,因此外部的 函数可以访问它并打印 。

Example of global functions and variables

local function testFunc() -- 本地范围
testVar = 64 -- 全球范围
end
testFunc()
print(testVar) -- 64

在以下代验证码中,全球变量 在 开始增量,每次循环 循环 循环后再打印最终值为 4 的值。


x = 0 -- 全球变量“x”
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ 结果输出:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]

因为你不需要输入那么多,所以宣言全球变量和函数更容易,但全球变量和函数与本地变量和函数相比有以下缺点:

  • Luau使用哈希查找访问全球变量和函数,因此在性能方面使用费用较高。在时间敏感循环中使用全球变量可以使其执行速度比使用本地变量在同一循环中慢 10% 以上。
  • Luau在范围结束后清理本地变量,减少内存使用。
  • 您可以在同一脚本中访问全球变量和函数,但不能在多个脚本之间访问。因此,全球变量或函数无法为在范围内的本地等价物、上值阴影提供任何好处。

本地范围

Luau只能在你声明它的代码块中访问本地变量或函数。创建具有本地范围的变量可让您更精确地控制值何时何地更改。

在以下代验证码中,testFunc() 函数和 testVar 变量具有本地范围。只有 testFunc() 内的代码才能访问 testVar 变量。变量 没有在 之外的值,因此调用 内打印了 的值,但调用 外打印了 。


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("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ 结果输出:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

捕获

在宣言并分配本地变量之后,您可以在其范围级别上阅读其范围由同一范围包含的本地变量的函数。这种技术被称为 捕获

在以下代验证码中,函数 f 捕获了本地变量 x 。变量 xf() 是一个 上值


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

影子

在宣言并分配本地变量之后,您可以在其范围级别和子范围级别上阅读它。如果你在子级等级重新声明并重新分配变量,那么你将创建一个新的本地变量与最早的分配相同的名称但不同的值。新的本地变量不会影响以前的分配的本地变量。这种技巧,称为 阴影 ,可以帮助你重用变量的名称而不重用其值。

在以下代验证码中,Luau 阴影了变量 x 。变量 xf() 中是一个 阴影 变量。


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

您还可以不为本地变量分配值,而重新声明它,以便在其范围级别和子范围级别中重新分配该变量。无需为本地变量分配值而重新声明其值将其值设置为 nil .

在以下代验证码中,Luau 阴影了本地变量 fruitName 在函数 getFruitByColor() 中。函数重新声明 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) -- 柠檬
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate