关于_ENV(lua5.2 or later)
问:
我调用了test模块中的del_env函数,可是main文件里的print并没有消失。
-- test.lua local test = {} function test.del_env () _ENV = nil end return test -- main.lua local test = require "test" test.del_env() print "after delete _ENV"答:
_ENV itself is never a global name in a chunk.
_ENV 仅仅是语法糖
你的文件事实上是一个函数
-- test.lua local _ENV function test.del_env() _ENV = nil end return test
你要看成是默认在前面加了一行 local _ENV然后在 load 的时候把当前的 _ENV 塞进去的
print "after" 事实上是_ENV.print "after"
你要删外面环境的 _ENV, 应该用 debug.getupvalue 遍历外层函数, 找到 _ENV 置空
lua 5.2 已经没有所谓全局变量这样的概念了
全部东西都是函数
你 load 一段代码事实上就是一个函数/闭包
假设你没有显式写 local _ENV 那么 parser 就帮你生成一个(假设你有全局变量语法
隐式的 _ENV 声明是 parser 帮你搞的
它的值是 loader 塞进去的
没有全局变量