• 任何未绑定声明的引用 var 在 Lua 语义上被翻译为 _ENV.var。
    • Lua 中每个块都由外部本地变量名为 _ENV 编译。
      • _ENV 本身不能当作任何未绑定声明的引用用于 Lua 块中。
    • 与外部 _ENV 变量和 任何未绑定声明的引用的存在不同,_ENV是一个完全正规的名字。
      • 可以用该变量名定义新的变量和参数。
      • 任何未绑定的声明对 _ENV 的引用都是可见的
        • 遵循了 Lua的可见规则
    • 任何用了 _ENV 的数值都称为环境。

    • Lua 有一个被称为全局环境 (Global Environment) 的特殊环境

    • 这个全局环境作为一个值保存在 C 语言注册表的一个特殊索引中。
    • 全局变量_G初始化这个值。
    • _G 从来不会在 Lua 内部使用,改变 _G 的值只会影响 Lua 代码。
    • 当 Lua 加载一个块时,他的 _ENV 变量默认值是全局环境。
    • 在默认情况下, Lua代码中的任何未绑定声明的引用指的是全局环境中的条目
      • 任何未绑定声明的引用也被称为全局变量。
    • 所有的标准库都被加载到全局环境中,一些 Lua 函数在该环境下运行。
      • 可以使用 load 或 loadfile 在不同的环境中加载块。
      • 在 C 语言中,必须加载块然后修改第一个 upvalue (lua_setupvalue)