对于function中定义的local变量只能活在这个function中,出了这个function就不存在了。
function bag(a)
local x = a
x = x + 1
print(x)
end
for i = 1, 10 do
bag(3)
bag(10)
print("-----------------")
end
输出结果:
这样的输出是理所当然的。
如果应用闭包,也就是说在一个函数中再嵌套一个函数,并返回被嵌套的函数,就会让外层函数的local变量的声明周期得到扩展,这跟C/C++中的函数中的static变量很类似,但又不同,先看个例子:
--Lua语言
function bag(a)
local x = a
function ff()
x = x + 1
print(x)
end
return ff
end
local fun1 = bag(3)
local fun2 = bag(10)
for i = 1, 10 do
fun1()
fun2()
print("-----------------")
end
输出结果:
可以看到bag函数中的local变量x的声明周期得到了扩展,保留了上次的值,并且对于两个bag赋予不同的初值进行同步工作,互相是不干扰的。就像同一个枪口发射多颗子弹,他们的运动轨迹相互是不被干扰的,所以闭包在这方面的游戏开发应用是非常广泛的。
再与C++的函数中的static变量比较一下:
void func(int a) {
static int x = a;
x++;
cout << x << endl;
}
int main() {
for (int i = 0; i < 10; i++) {
func(3);
func(10);
cout << "----------------------" << endl;
}
system("pause");
return 0;
}
输出结果:
可以看到函数内部的变量的生命周期同样得到了扩展,可以两个函数传入不同的参数进行工作时,第二个参数传入的值完全被忽略了,所以static是相互干扰的,这是不同于Lua闭包的重要特征。