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

Sam*_*uel 2 lua

例如

function foo1()
    local i=10 --or just i=10
end 
Run Code Online (Sandbox Code Playgroud)

该变量i在函数外不可见。所以我应该local明确声明它。或者它已经是一个local变量。

non*_*hip 5

在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的原因之一是因为它会将所有内容默认为本地(对我来说语法也更好)。

  • 局部变量的生存期与在其中定义它的源代码块(例如`do` ...`end`或`function` ...`end`)有关。upvalues是以前的局部变量,通过闭包的引用,其生存期已经超出了定义块的范围(这只是引用函数外部定义的局部变量的函数的奇特名称)。函数参数是局部变量,直到您创建一个引用它们的闭包为止,在这种情况下,它们将转换为升值。 (2认同)

Oli*_*ver 5

在线 Lua 参考手册第 2.3 节明确说明了这一点:

\n\n
\n

除非显式声明为局部变量,否则任何变量都被假定为全局变量(请参阅 \xc2\xa72.4.7)

\n
\n