在Lua中,使用和不使用"local"关键字声明的本地函数之间是否存在差异?

Aik*_*rum 4 lua scope

前言:据我所看到的,在网站上的文档真的不说这个了,我还没有发现任何人甚至这个问题,所以我敢肯定这两种形式是相同的,但我想知道如果有人知道肯定.

鉴于此Lua代码:

function f()
    function a() ... end
    local function b() ... end
    ...
end
Run Code Online (Sandbox Code Playgroud)

有没有之间的功能差异a()b()?我说的是性能,访问,警告,任何事情.最后,他们在运行时是否都具有完全相同的底层表示?

我怀疑没有任何区别,但我不确定,这让我感到困扰.我知道a()它的范围是封闭的函数f(),但是我不确定它是否真的使它成为一个局部变量,就如何在底层运行.有b(),我可以肯定.

我们从官方文档中知道,我对b()上面的定义是语法糖:

    local b
    b = function() ... end
Run Code Online (Sandbox Code Playgroud)

我很想相信,即使没有我的定义中的local关键字,最终的去糖定义也将遵循该格式,包括该部分.a()local a

我觉得我不能假设这一点.

Col*_*Two 8

function a() end在您的代码块中,a当函数运行时指定全局*,同时b保持函数的本地.

也许这段代码会更好地说明事情:

function f()
    function a() end
    local function b() end
end
print(a, b) -- nil, nil
f()
print(a, b) -- function: 0xdeadbeef, nil
Run Code Online (Sandbox Code Playgroud)

因此,为了避免污染全局环境,您仍应使用local函数内部.


*除非你宣布a在上述其他一些地方的范围f,在这种情况下a将保持其作用域.

  • `a`可能不是全球性的.这可能是一个升值. (2认同)