setfenv函数可以设置全局环境中有的变量或者函数,通过_G可以查看拥有的函数(比如print、setfenv等)与全局变量, 但是修改_G的指向一张空表 对系统环境是没有影响的,因为系统并不是访问_G来获取相关函数与变量!!!
理论总是枯燥,需要代码来验证:
print(_G)
_G.a=111
--_G ={} --对系统环境没有影响
print(a) --正常使用print 与 全局变量a
function fun111()
setfenv(1, { show=_G.print,a=222 })-- 将当前函数的环境表改变
--print(a) --错误,无print
show(a) --可以直接调用show ,并且a为222
end
fun111()
function fun222()
setfenv(2, { display=_G.print,a=333 })-- 将调用自己的函数的环境表改变
print("fun222",a) --可以正常使用,自己的环境不受影响
--display(a) -- 错误,无display
end
fun222()
--print("环境表为空")--报错
display(a) --打印新的环境a
运行效果: