lua中的闭包小结

function newCounter()
    local i=0
    return function()
        i=i+1
        return i
    end
end

c1=newCounter()
print(c1())
print(c1())

以上代码输出1,2
闭包=函数+引用环境。上述代码中的newCounter函数返回了一个函数,而这个返回的匿名函数就是闭包的组成部分中的函数,引用环境就是变量i所在的环境。实际上,闭包只是在形式和表现上像函数,但实际上不是函数,我们都知道,函数就是一些可执行语句的组合体,这些代码语句在函数被定义后就确定了,并不会再执行时发生变化,所以函数只有一个实例。而闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例,就好比相同的类代码,可以创建不同的类实例一样。在看别人的文章时,看到有这样的说法:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!

可以在Lua的函数中再定义函数,也就是内嵌函数,内嵌函数可以访问外部函数已经创建的所有局部变量,而这些变量就被称为该内嵌函数的upvalue,upvalue实际指的是变量而不是值,这些变量可以在内部函数之间共享,比如以下代码:

function fun1()
    local val=10
    function ifunc1()
        print(val)
    end

    function ifunc2()
        val=val+10
    end
    return ifunc1,ifunc2
end

local a,b=fun1()
a() --输出10
b()
a() --输出20

 

function myPower(x)
    return function(y)
        return y^x
    end
end

power2=myPower(2)
power3=myPower(3)

print(power2(4))
print(power3(5))

 

posted @ 2015-04-24 15:10  合唱团abc  阅读(277)  评论(0编辑  收藏  举报