例如
function foo1()
local i=10 --or just i=10
end
变量
i
在函数外不可见。那么我应该明确地将其声明为 local
吗?或者它已经是一个 local
变量。
在 Lua 中,每个未显式声明的变量
local
(参数除外,因为它们是由 VM 隐式创建的上值局部变量)是全局变量,因此这样做:
function foo1()
i=10
end
foo1()
print(i) -- prints "10"
与:
完全相同_G["foo1"] = function()
_G["i"]=10
end
foo1()
print(i) -- prints "10"
这很糟糕。所以你应该将其声明为:
local function foo1()
local i=10
end
foo1()
print(i) -- prints "nil", so it's local
编辑:但请注意闭包的上值。 例如这个:
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
编辑2:另外,您应该考虑将函数设为本地函数,这样它们就不会导致全局表膨胀。只需将它们声明为
local function ......
tl;dr:只要将所有内容都本地化,除非您确实有充分的理由不这样做(=从不),因为这样您就不会意外地冲突名称。 lua 默认将所有内容设置为全局是一个历史决定,如今被认为是不好的做法。我喜欢 MoonScript 的原因之一是因为它将所有内容默认为本地(而且语法对我来说更好)。
这在在线 Lua 参考手册第 2.3 节中有明确说明:
任何变量都被假定为全局变量,除非显式声明为局部变量(参见第 2.4.7 节)
在 Windows 上的 lu54 环境中运行时,不在函数中声明变量会使其成为全局变量。例如:
函数scope_test() 一些数字 = 25 结尾 范围_测试() 打印(某个数字)
结果打印出 25。
如果要在some_number前面添加本地,如下:
函数scope_test() 本地 some_number = 25 结尾 范围_测试() 打印(某个数字)
输出为零。