Lua 中,声明不带 "local" 关键字的局部函数和带上该关键字的局部函数有什么区别?

前言:据我所知,网站上的文档并没有详细讨论这个问题,我也没有找到任何人甚至只是提出这个问题,所以我相信这两种形式是相同的,但我想知道是否有人可以确切知道。

给出这个 Lua 代码:

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

a()b() 之间有功能上的任何区别吗?我所指的是性能、访问、警告等方面。最终,它们在运行时是否具有完全相同的基础表示形式?

我怀疑它们之间没有任何区别,但我不确定,这让我困扰。我知道 a() 在封闭函数 f() 中是 _作用域_,但我不确定这是否真正使它成为本地变量,就在内部功能上而言。使用 b(),我可以确定。

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

    local b
    b = function() ... end

我倾向于相信,即使在 我的 定义中没有 local 关键字,a() 的最终去糖化定义也会遵循完全相同的格式,包括 local a 部分。

我只是感觉我不能_假设_ 这一点。

点赞
用户7253993
用户7253993

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

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

在你真正想使用这个函数的文件中:

--file_B.lua
require "file_A.lua"

local performAnExpensiveComputation = performAnExpensiveComputation

local result = performAnExpensiveComputation() --现在你正在使用局部引用函数

这只是优化 lua 变量的技巧的一种变化。

2018-06-26 21:30:19
用户4403144
用户4403144

这并不是一个完整回答你的问题,但是 Lua 最易入门的内部结构讲解在 这里 ,由 Lua 的创造者编写。其中有关于本地变量的一些讨论,但是我认为并没有完全回答你的问题。关于“外部本地变量”和显式声明本地变量的区别的部分是非常有启发性的。

编辑: 另外还有 这个 。我需要再次阅读它,以确认它是否能完全回答你的问题。如果你先看到了答案,希望你能分享一下你所学到的内容!

2018-06-26 22:13:52
用户646619
用户646619

在你的代码块中,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


\* 除非你在 f 的其他范围内声明了 a 是局部变量,在这种情况下,a 将保持其作用域。

2018-06-27 00:00:51