面试小结(一) lua闭包

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部分吧。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值