Note:

1.Lua 中的变量全是全局变量,无论语句块或是函数里,除非用 local 显式声明为局部变量,变量默认值均为nil

2.使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。(代码块:指的是一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串))

x = 10
local i = 1                 --local to the chunk

while i <= x do
    local x = i * 2           --local to the while body
    print(x)
    i = i + 1
end

if i > 20 then 
    local x                     -- local to the "then" body
    x = 20
    print(x + 2)
else
    print(x)
end

print(x)

运行结果:

lua语言如何设置控件颜色 lua语言local_局部变量

 注意:如果在交互模式下上面的例子可能不能输出如期结果,因为第二句的local i=1是一个完整的chunk,在交互模式下执行完这一句后,Lua 将开始一个新的chunk,这样第二句的i 已经超出他的有效范围。可将这段代码放在do...end中(相当于C的{...})

3.尽可能使用局部变量,有两个好处

          a.避免命名冲突

          b.访问速度更快(原因是local变量是存放在lua的堆栈里面的是array操作,而全局变量是存放在_G中的table中,效率不及堆栈)

4. Lua中的函数可以作为全局变量也可作为局部变量,当我们将函数保存在一个局部变量里时,我们将得到一个局部函数。局部函数和局部变量一样在一定范围内有效。

          a. 使用function声明的函数为全局函数,在被引用时可以不会因为声明的顺序而找不到 
          b. 使用local function声明的函数为局部函数,在引用的时候必须要在声明的函数后面

function test()
    test2()
    test1()
end
 
local function test1()
    print("hello test1")
end
 
function test2()
    print("hello test2")
end
 
test()

 运行结果:

lua语言如何设置控件颜色 lua语言local_Lua_02

结果报错,因为局部函数test1未先声明。

5.其他补充:

        a.local变量过多也会有堆栈溢出的问题,一段过程下最多拥有200个local变量,且do end不算。类似这样:

local Class = {}

local test1 = 1

local test2 = 2

... --to 199

return Class

    如果超过199,则会报出main function has more than 200 local variables的错误。当然这里说的是一段过程,所以函数是另算的,同样一个函数的过程最多也不能超过200个local变量(调用函数则算转入下一个过程了)。

      b.模块级local变量暂无限制,但是也要考虑到热更新方面的问题:若是选择使用模块级local变量去存储模块的数据,那么在热更新方面的处理将会变得十分麻烦。从这点考虑的话,模块级local变量最好只是用于引用别的模块为妙。

参考资料:

https://musoucrow.github.io/2018/04/17/lua_local/