Lua: 局部函数的作用域

对于 Lua 中的局部函数,我有些困惑。请看下面这个简化的例子:

function test()
  local function f()
    print("f")
    g()
  end

  local function g()
    print("g")
  end

  f()
end

test()

运行这段代码时,我会在函数“f”中得到一个错误,因为函数“g”是一个空值。据我理解,当代码到达对函数“g”的调用,两个函数都应该已经被声明,因为两个函数都没有达到它们所在块(函数“test”)的结尾,所以它们应该仍然是可访问的。当将函数声明为全局变量时,这段代码正常工作,但我真的不知道为什么局部函数不起作用。甚至《Lua 程序设计》这本书对此也没有帮助。

点赞
用户107090
用户107090

local function g() <BODY> end 等价于 local g; g=function () <BODY> end

在函数 f 中,名称 g 解析为全局变量,因为 local g 出现在 f 结束之后。这就是错误信息告诉我们的:

attempt to call a nil value (global 'g')

尝试在 f 之前定义 g

2018-02-19 13:57:04