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