在Lua中,使用和不使用“ local”关键字声明的局部函数之间有区别吗?

时间:2018-06-26 21:13:06

标签: lua scope

前言:据我所知,该网站上的文档并没有真正说明这一点,而且我什至没有发现其他人在问这个问题,所以我很漂亮确保这两种形式是相同的,但是我想知道是否有人肯定

给出以下Lua代码:

function f()
    function a() ... end
    local function b() ... end
    ...
end

a()b()之间是否有功能上的区别?我说的是性能,访问权限,注意事项,等等。最终,它们在运行时都具有完全相同的基础表示吗?

我怀疑没有任何区别,但我不确定 ,这使我感到烦恼。我知道a()是封闭函数f()作用域,但是我不确定这是否真的使它成为内部变量的局部变量。有了b(),我可以肯定。

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

    local b
    b = function() ... end

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

我只是觉得我不能假设

2 个答案:

答案 0 :(得分: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

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


*除非您在a之上的其他范围声明f为本地,在这种情况下,a将保持其作用域。

答案 1 :(得分:0)

就性能而言,本地功能要比全局功能快。在大型代码库中,常见的lua优化技巧是将全局定义的函数“缓存”在本地引用中并使用后者。在代码中:

--file_A.lua
function performAnExpensiveComputation()
...
end

在您实际要使用此功能的文件中:

--file_B.lua
require "file_A.lua"

local performAnExpensiveComputation = performAnExpensiveComputation 

local result = performAnExpensiveComputation() --You are now using the locally referenced function

这只是用于optimize lua变量的技术的一种变体。