Lua:闭包函数是本地函数吗?

假设我有以下 Lua 代码:

function f(v)
    function g()
        return v * v
    end
    return g
end

显然,上述 Lua 代码中的 'g' 形成了一个闭包。我想知道的是:'g' 默认是否是“本地”函数?

我是否需要在 'function g()'之前明确添加 'local' 关键字,以使 'g' 真正本地?如果没有明确的“local”,如果'g'因此是“全局”的,任何人如何从外部范围访问 'g'?我怀疑我可以通过“f.g”来访问这种情况下的'g'。

如果 'g' 默认是“本地”的,那么在函数内部的函数定义(闭包)前面加上“local”的点是什么?

点赞
用户3838351
用户3838351

没问题,我想我自己得到了答案:

在没有打上'local'关键字的情况下,闭包'g'实际上是一个全局变量!因为在 Lua 中,函数声明本质上是将匿名函数赋值给命名变量的过程!因此,在上述代码中,闭包的定义等效于:

function f(v)
    g = function()
        return v * v
    end
    return g
end

根据 Lua 变量作用域规则,任何没有明确标记为'local'的变量都是全局变量,因此基本上'g'成为了一个全局函数,我相信任何人都可以在不出问题的情况下调用module.g()

如果在'g'前面加上'local',就会使它成为一个真正的局部变量,没有办法在'f'之外意外地访问它。

2014-09-27 01:33:11