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 里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)