关于闭包函数的概念和原理

首先要说一下闭包函数的概念

  我认为,与一个特定的执行环境相绑定的函数和它的执行环境的整体就叫做闭包,它并不是一个单纯的函数。

  下面用一个书上的例子说明一下: 

function list_iter (t)  --闭包创建函数(工厂函数)
        --这里是执行环境
    local i = 0
    local n = troggle()
        --end      
        
        --相绑定的函数
    return function ()
        i = i + 1
        if i <= n then return t[i] end
    end
end·    

  执行环境有以下特点:

    1、只在调用工厂函数的时候都创建一次

    2、每次调用工厂函数时都会生成一个特定的闭包(有一个与其他闭包独立的执行环境)

    3、有且仅有绑定程序可以修改对应闭包中的执行环境

 

闭包的实现其实很简单,只需要实现以下两点

  1、内部函数可以访问外部函数中的变量(即upvalue)

  2、在创建出来的内部函数变量仍存在时,被其访问的外部函数中的变量不被释放

 

暂时找不到Lua的闭包实现方法,等期末考试完了就去翻一下lua的文档和源代码看一下再写吧,以下的一篇讨论Javascript的闭包实现的文章

  http://blog.zol.com.cn/4886/article_4885285.html

估计Lua的设计也差不多,简述一下原理:

  每个函数有一个作用域属性和作用域链属性,每个作用域保存着活动对象(变量),作用域链保存函数引用的作用域。只要一个作用域还被某个作用域链使用,那么它就不会被GC回收自然作用域中的活动对象(变量)也可以保存下来继续使用。加上作用域属性和作用域链属性在创建函数时生成,因此每个闭包的执行环境都是独有的。

转载于:https://www.cnblogs.com/kirito/archive/2012/12/20/2826592.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值