您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-Lua之闭包

2016-06-18 08:43 411 查看
对于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闭包的重要特征。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: