import{_ as a,c as e,o as l,a4 as t}from"./chunks/framework.Cy9JvDAg.js";const f=JSON.parse('{"title":"2.2 - 环境和全局环境","description":"","frontmatter":{"title":"2.2 - 环境和全局环境","footer":true,"lastUpdated":true,"outline":false},"headers":[],"relativePath":"2.2.md","filePath":"2.2.md"}'),_={name:"2.2.md"},r=t('<h2 id="_2-2-环境和全局环境" tabindex="-1">2.2 - 环境和全局环境 <a class="header-anchor" href="#_2-2-环境和全局环境" aria-label="Permalink to &quot;2.2 - 环境和全局环境&quot;">​</a></h2><p>正如我们将在<a href="/lua5.4-manual-zh/3.2.html">3.2</a>和<a href="/lua5.4-manual-zh/3.3.3.html">3.3.3</a>所述，对一个自由名称（即一个未绑定任何声明的名称）的任意引用“var”都会在句法上被转换为“_ENV.var”。此外，每个代码块都被编译在有着一个名为_ENV的外部局部变量的空间中（参见<a href="/lua5.4-manual-zh/3.3.2.html">3.3.2</a>），所以_ENV本身在块中从来都不是一个自由名称。</p><p>尽管有外部变量_ENV以及自由名称的转换，但是_ENV完全是个合规名称。所以你可以给这个名称定义一个新变量和参数。程序中每个自由名称的引用都对于_ENV的点可见，符合Lua的可见性规则（参见<a href="/lua5.4-manual-zh/3.5.html">3.5</a>）。</p><p>任何作为_ENV值的表都称为<em>环境（environment）</em>。</p><p>Lua保存着一个叫做 <em>全局环境（global enviroment）</em> 的特定环境，它的值被保存在C注册表（参见<a href="/lua5.4-manual-zh/4.3.html">4.3</a>）中的一个特殊索引上。在Lua中，全局变量_G被初始化为之前所保存的值（_G未被内部使用，所以更改_G的值只会影响你自己的代码）。</p><p>当Lua加载了一个代码块，其_ENV变量的默认值为全局环境（参见<a href="/lua5.4-manual-zh/6.1.html#load">load</a>）。因此，一般来说Lua中的自由名称是对全局环境中成员的引用，所以它们也称作 <em>全局变量（global variables）</em> 。此外，所有的独立库都被加载到全局环境中且有些函数会操作它们的环境。你可以使用<a href="/lua5.4-manual-zh/6.1.html#load">load</a>（或者<a href="/lua5.4-manual-zh/6.1.html#loadfile">loadfile</a>）来将代码块加载到不同的环境中。（对于C，你可以在直接加载代码块并改变第一个upvalue的值；参见<a href="/lua5.4-manual-zh/4.7.html#lua_setupvalue">lua_setupvalue</a>）</p>',6),u=[r];function o(h,m,n,s,p,d){return l(),e("div",null,u)}const c=a(_,[["render",o]]);export{f as __pageData,c as default};
