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

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

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

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

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/p/2826592.html