类型为 thread ,function ,以及 userdata 的对象,除了 metatable 外还可以用另外一个与之关联的被称作 它们的环境的一个表, 像 metatable 一样,环境也是一个常规的 table ,多个对象可以共享 同一个环境。
userdata 的环境在 Lua 中没有意义。 这个东西只是为了在程序员想把一个表关联到一个 userdata 上时提供便利。
关联在线程上的环境被称作全局环境。
全局环境被用作它其中的线程以及线程创建的非嵌套函数
(通过 loadfile
, loadstring
或是
load
)的缺省环境。
而且它可以被 C 代码直接访问(参见 §3.3)。
关联在 C 函数上的环境可以直接被 C 代码访问(参见 §3.3)。 它们会作为这个 C 函数中创建的其它函数的缺省环境。
关联在 Lua 函数上的环境用来接管在函数内对全局变量(参见 §2.3)的所有访问。 它们也会作为这个函数内创建的其它函数的缺省环境。
你可以通过调用 setfenv
来改变一个 Lua 函数
或是正在运行中的线程的环境。
而想操控其它对象(userdata、C 函数、其它线程)的环境的话,就必须使用 C API 。