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)
运行结果:
注意:如果在交互模式下上面的例子可能不能输出如期结果,因为第二句的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()
运行结果:
结果报错,因为局部函数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变量最好只是用于引用别的模块为妙。
参考资料: