为何Lua中函数可访问后置声明的全局变量却无法访问后置声明的局部变量?
Lua全局变量与局部变量的作用域差异
这是Lua变量作用域规则导致的差异,核心区别在于全局变量和局部变量的访问范围:
1. 全局变量的特性
全局变量默认存入Lua的全局环境表_G中,整个程序的所有函数、代码块都能直接访问它,除非被同名局部变量覆盖。
示例代码:
function foo() print(a) -- 访问全局环境中的a end a = 10 -- 声明全局变量a foo() -- 输出10
这里a是全局变量,定义后foo函数可以直接从全局环境中读取它的值。
2. 局部变量的特性
局部变量仅在它被声明的代码块(比如函数体、do-end块、当前文件的局部作用域段)内有效,外部未嵌套在该作用域内的函数无法访问。
示例代码:
function foo() print(a) -- 此处会优先查找全局环境中的a,而非下方的局部a end local a = 10 -- 局部变量a的作用域仅限当前代码块(当前文件中该行之后的代码,但foo不在此作用域内) foo() -- 输出nil,因为全局环境中的a从未被赋值
这里的local a只在它所在的局部作用域内生效,foo函数是在该局部变量声明前定义的,且不在其作用域内,所以foo会去全局环境查找a,而全局a未被赋值,因此输出nil。
额外补充:闭包对局部变量的访问
如果函数是在局部变量的作用域内定义的,会形成闭包,从而可以访问该局部变量:
do local a = 10 function foo() print(a) -- 通过闭包访问外层作用域的局部a end end foo() -- 输出10
内容的提问来源于stack exchange,提问作者Ashutosh Biswas
相关产品推荐
相关产品推荐

