local是我们在lua编程里面经常写的,经常写的方式为local foo = foo。lua对local的处理有加速访问的效果,并且将变量定义为局部变量也是一种好的编程习惯。
lua对变量和表的local化处理的方式是不同的
======example======
foo = {}
foo.a =1
do
local foo = foo
foo.a =2
print(foo, _G["foo"])
print(foo.a)
print(_G["foo"].a)
end
print(_G["foo"].a)
print("----next case----")
var = 1
do
local var = var
var = 2
print(var)
print(_G["var"])
end
print(_G["var"])
执行结果:
table: 0x7febca407920 table: 0x7febca407920
2
2
2
----next case----
2
1
1
=============
通过代码结果可以看到,local表=全局表,是同一个表,这主要是由于lua的表机制是匿名的,相当于函数的指针,local foo = foo,即使本地foo没有在全局_G注册,还是引用的是同一个表。当没有变量指向表的时候,垃圾回收器会销毁这个匿名表。
而local变量则是创建一个新的变量,遵守子作用域覆盖父作用域的规则。
特别是对于require "modname"中的模块,在编写的时候,不能直接使用全局变量,因为是同一个变会保存其变量状态影响其他使用。最好的处理方式就是尽可能的依据入参,函数内部定义local 变量等来编写代码。
转载于:https://blog.51cto.com/bosswanghai/1832139