例如
function foo1()
local i=10 --or just i=10
end
Run Code Online (Sandbox Code Playgroud)
该变量i在函数外不可见。所以我应该local明确声明它。或者它已经是一个local变量。
在Lua中,每个未明确声明的变量local(参数除外,因为它们是VM隐式创建的upvalue局部变量)都是全局变量,因此请执行以下操作:
function foo1()
i=10
end
foo1()
print(i) -- prints "10"
Run Code Online (Sandbox Code Playgroud)
与以下内容完全相同:
_G["foo1"] = function()
_G["i"]=10
end
foo1()
print(i) -- prints "10"
Run Code Online (Sandbox Code Playgroud)
不好 因此,您应将其声明为:
local function foo1()
local i=10
end
foo1()
print(i) -- prints "nil", so it's local
Run Code Online (Sandbox Code Playgroud)
编辑:但是请注意闭包的升值。例如:
local function foo()
local i=10
local function bar()
i=5
end
print(i) -- 10
bar()
print(i) -- 5
end
print(i) -- nil
foo()
print(i) -- nil
Run Code Online (Sandbox Code Playgroud)
编辑2:同样,您应该考虑将函数设为本地,这样它们就不会膨胀全局表。只需声明为local function ......
tl; dr:除非您确实有充分的理由不要(= never),否则就将所有内容都本地化,因为那样一来您就不会偶然碰撞名称。lua将所有内容默认设置为全球通用是一个历史决定,如今已被视为不良做法。我之所以喜欢moonscript的原因之一是因为它会将所有内容默认为本地(对我来说语法也更好)。