这样做有什么好处吗——整个脚本的本地函数和非本地函数之间有区别吗?
使用当地人的好处是双重的:
First, 当地人通常更快,因为它们只是使用 Lua 虚拟机中的寄存器,而全局变量是全局表(实际上是一个哈希映射)中的条目。调用全局函数需要首先对哈希图进行索引。
Second, 当地人帮助提高代码质量,因为它们仅在本地范围内可见(例如,文件,甚至在 if 分支、循环等内)。把一切都放在全球范围内被称为“全球污染”,令人不悦。它还会减慢全球访问速度,因为它会使全球表变得臃肿。请注意,Lua 允许使用以下命令更改环境_ENV
(or setfenv
在旧版本中),因此有时您可以通过这样做来保存本地关键字和前向声明,而不会污染全局环境。但通常你不应该改变环境。
正如 Nicol Bolas 指出的那样,全局变量通常用于公开接口。您也可以使用return my_api_table
在您的文件末尾;然后可以使用“导入”API 表local my_api_table = require(relative_path)
.
这是因为代码出现在代码中启动它的位置之后,而在启动器执行时它还不存在吗?
是的。您可以使用“转发本地声明”来解决此问题GetLevel
:
local UseLevel = true
local Limit = 0
local GetLevel -- "forward declaration" for Launcher
local function Launcher()
print("trying to launch GetLevel now")
GetLevel()
end
-- This is the same as GetLevel = function() ... end and thus does not set a global variable
-- but instead assigns to the previously declared local variable GetLevel
function GetLevel()
print("GetLevel was launched")
if UseLevel then
Limit = 4
else
Limit = 5
end
end
简单地把Launcher
下面的函数GetLevel
也有效:
local UseLevel = true
local Limit = 0
local function GetLevel()
print("GetLevel was launched")
if UseLevel then
Limit = 4
else
Limit = 5
end
end
local function Launcher()
print("trying to launch GetLevel now")
GetLevel()
end