2.2 环境与全局环境

后面在 §3.2 以及 §3.3.3 会讨论,引用一个叫 var 的自由名字(指在任何层级都未被声明的名字)在句法上都被翻译为 _ENV.var 。此外,每个被编译的 Lua 代码块都会有一个外部的局部变量叫 _ENV(参见 §3.3.2),因此,_ENV 这个名字永远都不会成为一个代码块中的自由名字。

在转译那些自由名字时,_ENV 是否是那个外部的局部变量无所谓。_ENV 和其它你可以使用的变量名没有区别。这里特别指出,你可以定义一个新变量或指定一个参数叫这个名字。当编译器在转译自由名字时所用到的 _ENV ,指的是你的程序在那个点上可见的那个名为 _ENV 的变量。(Lua 的可见性规则参见 §3.5

ENV 用于值的那张表被称为 环境_。

Lua 保有一个被称为 全局环境 特别环境。它被保存在 C 注册表(参见 §4.5)的一个特别索引下。在 Lua 中,全局变量 _G 被初始化为这个值。(_G 不被内部任何地方使用。)

当 Lua 加载一个代码块,ENV 这个上值的默认值就是这个全局环境(参见 load)。因此,在默认情况下,Lua 代码中提及的自由名字都指的全局环境中的相关项(因此,它们也被称为 全局变量_ )。此外,所有的标准库都被加载入全局环境,一些函数也针对这个环境做操作。你可以用load (或 loadfile)加载代码块,并赋予它们不同的环境。(在 C 里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)