function f1()
local i = 0
local function f2()
i = i + 1
print(i)
end
return f2
end
g1 = f1()
g1() --->1
g1() --->2
g1() --->3
g2 = f1()
g2() --->1
g2() --->2
g1() --->4
去面试的时候,第一个问题就是lua的闭包是什么?我一脸懵逼,这是啥,不晓得啊。今天百度了好多,虽然搞懂了大致是啥,但是还是不晓得有什么应用。后来看了篇文章:
--以下用cocos2dx中的Lua来举例...
--2dx通过tolua++把类方法导出
--举例api
--按钮响应回调函数格式为:
--luaFunc(event)
--event为触摸按下,触摸移动,触摸离开等事件
--lua中的API为:
--UIButton::addListenHandler(luaFunc)
--实际需求是我按钮按下时,我需要改变按钮自身的纹理...此时回调中却没有按钮本身的对象(sender),怎么办呢?
--利用闭包就轻松解决了
--下面是LUA实战例子:一个testUI的页面类
local testUI = testUI or {}
local testUI:onBtnClick(sender,event)
--可获取的参数有:隐藏的self,btn,event
end
function testUI:initButton()
local btn = UIButton:create()
--重点来了
btn:addListenHandler(
function(event)
--使用闭包把self,btn都传进去了....
self:onBtnClick(btn,event)
end
)
end
return testUI
然后恍然大悟,原来这就是闭包啊
2.28更
在看关于lua性能优化的时候看到这篇文章,更好的理解了闭包的优点。
下面的代码创建一个包含返回常数值1到100000的若干个函数的表:
local lim = 10000
local a = {}
for i = 1, lim do
a[i] = loadstring(string.format("return %d", i))
end
print(a[10]()) --> 10
执行这段代码需要1.4秒。
通过使用闭包,我们可以避免使用动态编译。下面的代码只需要十分之一的时间完成相同的工作:
function fk (k)
return function () return k end
end
local lim = 100000
local a = {}
for i = 1, lim do
a[i] = fk(i)
end
print(a[10]()) --> 10
emmmmm。。。后来想了想,还是没有理解,难道第一段代码耗性能部分应该是在loadstring和string.format部分吧。。。