3.1 变量声明
全局变量
在 Lua 中,不加 local 关键字声明的变量默认是全局变量:
1 | -- 全局变量 |
即使是在循环或条件分支内部,不加 local 也是全局的:
1 | for i = 1, 3 do |
注意:全局变量不需要提前声明,未赋值的全局变量的值是
nil。
局部变量
使用 local 关键字声明局部变量:
1 | local name = "局部" |
局部变量的作用域从声明位置开始,到所在的块(do...end、函数体、文件结尾)结束:
1 | do |
变量命名建议
- 尽量使用
local,避免全局变量污染 - 函数内外都使用
local,提高性能(访问局部变量比全局变量快) - 全局变量只在需要模块导出时使用
3.2 多值赋值
Lua 支持一次性给多个变量赋值:
1 | -- 基本多值赋值 |
3.3 作用域规则
作用域层级
Lua 的作用域以 do...end、函数体或文件为单位:
1 | local a = "文件级" -- 文件作用域 |
变量查找规则
访问变量时,Lua 按照以下顺序查找:
- 当前块的局部变量
- 外层块的局部变量
- 当前文件的局部变量
- 全局环境
_G中的变量
1 | local x = "全局局部" |
3.4 全局环境 _G
Lua 将所有全局变量存储在一个名为 _G 的表中。你可以像操作普通表一样操作 _G:
1 | -- 创建全局变量(通常方式) |
检查变量是否存在
1 | if _G.myVar ~= nil then |
注意:
_G本身也是一个全局变量,所以_G._G == _G成立。
3.5 局部变量与性能
性能差异
访问局部变量比全局变量快,因为局部变量直接存储在寄存器中,而全局变量需要查表:
1 | -- 性能优化技巧:将频繁访问的全局函数缓存为局部变量 |
局部变量实践
1 | -- 好的实践 |
3.6 变量命名最佳实践
命名风格
1 | -- 局部变量:驼峰命名 |
常见命名误区
1 | -- 避免使用 Lua 保留字 |
3.7 本章小结
- 变量默认是全局的,使用
local声明局部变量 - 多值赋值可以一次给多个变量赋值,方便交换变量
- 作用域按
do...end块和函数体嵌套 - 变量查找:当前块 → 外层块 → 文件级 → 全局
_G是全局环境表,可以查看和操作所有全局变量- 局部变量性能更好,应优先使用
练习题
- 不使用
local在函数内声明一个变量,在函数外访问它,验证其为全局变量 - 使用多值赋值交换三个变量的值:
a=1, b=2, c=3变成a=3, b=1, c=2 - 编写一段代码展示作用域嵌套的变量屏蔽效果
- 通过
_G表列出当前环境中所有以 “p” 开头的全局变量 - 将一个全局函数(如
tostring)缓存为局部变量并在循环中使用