前言:据我所知,该网站上的文档并没有真正说明这一点,而且我什至没有发现其他人在问这个问题,所以我很漂亮确保这两种形式是相同的,但是我想知道是否有人肯定 。
给出以下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
部分。
我只是觉得我不能假设。
答案 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
变量的技术的一种变体。