在Lua中,为未声明的变量分配未定义的标识符意味着什么?

Ian*_*oyd 0 lua world-of-warcraft

我正在阅读Lua代码文件,文件的顶部包含:

    1  | TradeSkillFrameReset = TradeSkillFrame_LoadUI;
    2  | 
    3  | TradeSkillFrame_LoadUI = function()
    4  |    TradeSkillFrameReset();
            ...
    112|    TradeSkillFrame_LoadUI = TradeSkillFrameReset;
            ...
    114| end;

他们正在完成任务的第一行:

TradeSkillFrameReset = TradeSkillFrame_LoadUI;
Run Code Online (Sandbox Code Playgroud)

此时,在代码文件中,它们将未声明的标识符(TradeSkillFrame_LoadUI)分配给未声明的变量(TradeSkillFrameReset).这是允许在Lua?

  • 变量声明隐含了吗?
  • 是否所有未声明的标识符都被假定为前向声明?

更令人困惑的是,第一个TradeSkillFrame_LoadUI似乎做的就是召唤自己:

TradeSkillFrame_LoadUI = function()
   TradeSkillFrameReset();
Run Code Online (Sandbox Code Playgroud)

这怎么不是无限循环?


编辑:添加对TradeSkillFrameReset和的剩余引用TradeSkillFrame_LoadUI.

Der*_*hen 5

如果TradeSkillFrame_LoadUI是全局函数,则第一个语句将捕获此函数TradeSkillFrameReset.

然后,分配TradeSkillFrame_LoadUI将全局函数替换为新函数,该函数首先通过TradeSkillFrameReset引用调用原始函数.

这种模式称为"函数挂钩",这里有一些关于一般技术和一些魔兽世界Lua环境特定细节的更多信息(这个脚本可能来自哪里,根据函数的名称)

一些示例代码,以明确这一点:

function SomeGlobalFunction()
    print("I'm the original global function")
end

OrigFunction = SomeGlobalFunction

SomeGlobalFunction = function()
    OrigFunction()
    print("And here's the modfied one...")
end

--...
SomeGlobalFunction()
Run Code Online (Sandbox Code Playgroud)

这将打印以下输出:

我是最初的全球职能部门

这是修改过的......

作为旁注,Lua的名字并非全部大写.