我应该在Lua中将函数中的变量定义为局部变量吗?

function foo1()
    local i=10 --或者直接 i=10
end

变量 i 在函数外不可见。所以我应该显式地将它声明为 local。还是它已经是 local 变量了。

点赞
用户668125
用户668125

在 Lua 中,每个未显式声明为 local 的变量(除了函数参数,因为它们是隐式由虚拟机创建的上值局部变量)都是全局变量,所以这样写:

function foo1()
  i=10
end

foo1()
print(i) -- 输出 "10"

与这样写是一样的:

_G["foo1"] = function()
  _G["i"]=10
end

foo1()
print(i) -- 输出 "10"

这是很糟糕的。所以你应该这样声明:

local function foo1()
  local i=10
end

foo1()
print(i) -- 输出 "nil",所以它是局部的

但要注意闭包的上值。例如这样:

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"

此外,你应该考虑将函数声明为局部变量,这样它们不会扩充全局表。只需要声明为 local function ......

简而言之,除非真的有很好的理由(=从不),否则将所有东西都声明为局部变量,因为这样你就不会意外发生命名冲突。在 Lua 中默认将所有东西都设为全局变量是一种历史决策,现在被认为是不好的做法。其中一个我喜欢 MoonScript 的原因是它默认将所有东西设为局部变量(同时语法对我来说更好看)。

2014-07-14 04:43:19
用户869951
用户869951

这在在线 Lua 参考手册的第2.3节中已经清楚地说明:

除非显式声明为本地变量(参见§2.4.7),否则任何变量都被认为是全局变量。

2014-07-14 13:18:36