我应该在lua中将函数中的变量定义为本地变量吗

问题描述 投票:0回答:3

例如

function foo1()
    local i=10 --or just i=10
end 

变量

i
在函数外不可见。那么我应该明确地将其声明为
local
吗?或者它已经是一个
local
变量。

lua
3个回答
12
投票

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


5
投票

这在在线 Lua 参考手册第 2.3 节中有明确说明:

任何变量都被假定为全局变量,除非显式声明为局部变量(参见第 2.4.7 节)


0
投票

在 Windows 上的 lu54 环境中运行时,不在函数中声明变量会使其成为全局变量。例如:

函数scope_test() 一些数字 = 25 结尾 范围_测试() 打印(某个数字)

结果打印出 25。

如果要在some_number前面添加本地,如下:

函数scope_test() 本地 some_number = 25 结尾 范围_测试() 打印(某个数字)

输出为零。

© www.soinside.com 2019 - 2024. All rights reserved.