Lua - 函数中的局部变量作用域

5
我有以下的函数。
function test()

  local function test2()
      print(a)
  end
  local a = 1
  test2()
end

test()

这会打印出nil

以下脚本

local a = 1
function test()

    local function test2()
        print(a)
    end

    test2()
end

test()

输出结果为1。

我不理解这个。我认为声明一个本地变量使它在整个块中有效。由于变量'a'在test()函数作用域中声明,而test2()函数也在同一作用域中声明,为什么test2()没有访问test()本地变量的权限?


3
Lua不同于JavaScript,它不会"提升"变量。 - Etan Reisner
2个回答

5

test2可以访问已经声明过的变量。变量声明的顺序很重要。因此,请先声明a,再声明test2

function test()

    <b>local a;</b> -- same scope, declared first

    local function test2()
        print(a);
    end

    a = 1;

    test2(); -- prints 1

end

test();

6
局部变量的作用域从声明后的第一条语句开始,持续到包含该声明的最内层块的最后一条非空语句。 - Keith Thompson
实际上,只有“local a”部分需要首先出现,因为分配给它的值可能尚未知道。因此,赋值仍然可以遵循内部函数的定义。 - tonypdmtr
@tonypdmtr 是的,不过这就是我说“声明”的原因。 - canon

3

在第一个例子中,因为在使用 a 时没有声明过 a,所以你会得到 nil。因此编译器会将 a 声明为全局变量。在调用 test 之前设置 a 就可以解决这个问题。但如果你将 a 声明为局部变量,则无法解决该问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接