lua变量

一)全局-局部变量

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

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

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

-- 定义一个全局变量
gName = "我是个全局变量";
-- 用三种方式输出变量的值
print(gName);
print(_G["gName"]);
print(_G.gName);

二)虚变量

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

local start, finish = string.find("hello", "he") --start 值为起始下标,finish
                                                 --值为结束下标
print ( start, finish )                          --输出 1   2

local start = string.find("hello", "he")      -- start值为起始下标
print ( start )                               -- 输出 1

local _,finish = string.find("hello", "he")   --采用虚变量(即下划线),接收起
                                              --始下标值,然后丢弃,finish接收
                                              --结束下标值
print ( finish )                              --输出 2

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

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

local t = {1, 3, 5}

print("all  data:")
for i,v in ipairs(t) do
    print(i,v)
end

print("")
print("part data:")
for _,v in ipairs(t) do
    print(v)
end

执行结果:
# luajit test.lua
all  data:
1   1
2   3
3   5

part data:
1
3
5

lua变量

上一篇:前端性能优化-懒加载和预加载


下一篇:Vue中添加进度条效果(使用nprogress)