全局变量/局部变量/虚变量

一)全局-局部变量

全局变量是指:这个变量在没有被同名局部变量覆盖的时候,所有代码块都是可见的。

局部变量是指:该变量只在被申明的代码块中可见,并且可以覆盖同名全局变量或者外层局部变量。

Lua 中的局部变量要用 local 关键字来显式定义,不使用 local 显式定义的变量就是全局变量:

g_var = 1 -- 全局变量 
local l_var = 2 -- 局部变量

1)局部变量作用域 局部变量的生命周期是有限的,它的作用域仅限于声明它的块(block)。

一个块是一个控制结构的执行体、或者是一个函数的执行体再或者是一个程序块(chunk)。

我们可以通过下面这个例子来理解一下局部变量作用域的问题:

x = 10          -- 全局变量
local i = 1         -- 程序块中的局部变量 i

while i <=x do      -- 判断条件的x为全局变量的x
  local x = i * 2   -- while 循环体中的局部变量 x
  print(x)          -- output: 2, 4, 6, 8, ...
  i = i + 1
end

print("while循环结束");
 
if i > 20 then
  local x                 -- then 中的局部变量 x
  x = 20
  print(x + 2)  -- 如果i > 20 将会打印 22,此处的 x 是局部变量
else
  print(x)          -- 打印 10,这里 x 是全局变量
end

print(x)            -- 打印 10

2)使用局部变量的好处

局部变量可以避免因为命名问题污染了全局环境

local 变量的访问比全局变量更快 由于局部变量出了作用域之后生命周期结束,这样可以被垃圾回收器及时释放

在生产环境中,我们应该尽可能用 局部变量。

3)全局变量,其实本质上也是一个table

它把我们创建的全局变量都保存到一个table里了。而这个table的名字是:_G

二)虚变量

当一个方法返回多个值时,有些返回值有时候用不到,要是声明很多变量来一一接收,显然不太合适(不是不能)。 Lua 提供了一个虚变量,以单个下划线(“_”)来命名,用它来丢弃不需要的数值,仅仅起到占位的作用。

代码倒数第二行,定义了一个用 local 修饰的 虚变量(即 单个下划线)。使用这个虚变量接收 string.find() 第一个返回值,静默丢掉,这样就直接得到第二个返回值了。

虚变量不仅仅可以被用在返回值,还可以用在迭代等。

结果:

Last updated

Was this helpful?