Skip to content

2.2 - 环境和全局环境

正如我们将在3.23.3.3所述,对一个自由名称(即一个未绑定任何声明的名称)的任意引用“var”都会在句法上被转换为“_ENV.var”。此外,每个代码块都被编译在有着一个名为_ENV的外部局部变量的空间中(参见3.3.2),所以_ENV本身在块中从来都不是一个自由名称。

尽管有外部变量_ENV以及自由名称的转换,但是_ENV完全是个合规名称。所以你可以给这个名称定义一个新变量和参数。程序中每个自由名称的引用都对于_ENV的点可见,符合Lua的可见性规则(参见3.5)。

任何作为_ENV值的表都称为环境(environment)

Lua保存着一个叫做 全局环境(global enviroment) 的特定环境,它的值被保存在C注册表(参见4.3)中的一个特殊索引上。在Lua中,全局变量_G被初始化为之前所保存的值(_G未被内部使用,所以更改_G的值只会影响你自己的代码)。

当Lua加载了一个代码块,其_ENV变量的默认值为全局环境(参见load)。因此,一般来说Lua中的自由名称是对全局环境中成员的引用,所以它们也称作 全局变量(global variables) 。此外,所有的独立库都被加载到全局环境中且有些函数会操作它们的环境。你可以使用load(或者loadfile)来将代码块加载到不同的环境中。(对于C,你可以在直接加载代码块并改变第一个upvalue的值;参见lua_setupvalue