2.2 – Environments and the Global Environment
As will be discussed in §3.2 and §3.3.3, any reference to a global name var
is syntactically translated to _ENV.var
. Moreover, every chunk is compiled in the scope of an external local variable called _ENV
(see §3.3.2), so _ENV
itself is never a global name in a chunk.
Despite the existence of this external _ENV
variable and the translation of global names, _ENV
is a completely regular name. In particular, you can define new variables and parameters with that name. Each reference to a global name uses the _ENV
that is visible at that point in the program, following the usual visibility rules of Lua (see §3.5).
Any table used as the value of _ENV
is called an environment.
Lua keeps a distinguished environment called the global environment. This value is kept at a special index in the C registry (see §4.5). In Lua, the variable _G
is initialized with this same value.
When Lua compiles a chunk, it initializes the value of its _ENV
upvalue with the global environment (see load
). Therefore, by default, global variables in Lua code refer to entries in the global environment. Moreover, all standard libraries are loaded in the global environment and several functions there operate on that environment. You can use load
(or loadfile
) to load a chunk with a different environment. (In C, you have to load the chunk and then change the value of its first upvalue.)
If you change the global environment in the registry (through C code or the debug library), all chunks loaded after the change will get the new environment. Previously loaded chunks are not affected, however, as each has its own reference to the environment in its _ENV
variable. Moreover, the variable _G
(which is stored in the original global environment) is never updated by Lua.