关于_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 塞进去的
 没有全局变量



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值