全局变量在大多数编程语言中是让人爱恨交织又不可或缺的。一方面,使用全局变量会明显地使无关的代码部分纠缠在一起,容易导致代码复杂。另一方面,谨慎地使用全局变量又能很好地表达程序中真正的全局概念;此外,虽然全局变量看似无害,但像 Lua
语言这样的嵌入式语言更复杂:虽然全局变量是在整个程序中可见的变量,但由于 Lua
语言是由宿主应用调用代码段( chunk
)的,因此“程序”的概念不明确。
Lua
语言通过不使用全局变量的方法来解决这个难题,但又不遗余力的在 Lua
语言中对全局变量进行模拟。在第一种近似的模拟中,我们可以认为 Lua
原因把所有的全局变量保存在一个称为全局环境的普通表中。
由于不需要再为全局变量创造一种新的数据结构,因此使用一个表来保存全局变量的一个优点是简化了 Lua
语言的内部实现。另一个优点是,可以像操作其他表一样操作这个表。为了便于实现这种操作方式, Lua
语言将全局环境自身保存在全局变量 _G
中。
提示
_G._G
与 _G
等价。
使用如下代码可以输出全局环境中所有全局变量的名称:
for n in pairs(_G) do print(n) end