1.平时环境
平时大家如果不更改环境的话 其实都是在_G的环境写编写的 也就是说
gname = "1111111111" print(_G.gname)
是会输出1111111111的 这里的_G 可以理解为 lua先自己写了
table _G = {
--
}
然后大家定义的全局变量都在这个table之中
2.自己更改环境
-- 将当前全局环境重新设置为新的table setfenv(1, {}); gname = "1111111111" print(gname)
此时当前的环境就会报错 不认识这个print 因为当前的环境已经变成了另外一个table
3.更改的环境引用其他的函数
gName = "1111111111"; -- 将当前全局环境重新设置为新的table setfenv(1, {g = _G}); g.print(gName); -- 再次定义一个全局变量 gName = "2222222222"; -- 再次输出值 g.print(gName); -- 输出原来的值 g.print(g.gName);
此时的输出结果是:
nil
2222222222
1111111111
如何理解?
我们转换一下
table _G = {
gName = "1111111111"
function print() -- 具体内容不写
end
}
以上就相当于setfenv(1, {g = _G});这个语句之前的环境
g = G
table 当前 = {
g.print(gName)
gName = "2222222222"
g.print(gName)
g.print(g.gName)
}
以上就相当于setfenv(1, {g = _G})这个语句之后的环境
所以g.print 调用的是table_G中的print
而第一个输出的就是没有值的 为nil 因为这个语句之前根本就没有定义过gName
而第二个输出的是222222222222 这个是本环境下的全局变量
而第三个输出的是1111111111 因为它引用的是_G环境下的变量