在lua中函数作为第一类值,可以像变量一样,被用作给其他变量赋值,给其他函数当作参数。
词法界定:内部嵌套的函数可以调用外部函数的局部变量。
匿名函数:
先讨论一下函数的定义,函数是可以用以下形式定义:
fun = function (x) print(“abc”)end
这样的形式就像是一个参数,当函数作为另一个函数的实参的时候,是可以不需要函数名的,也就是匿名函数。
funOne = function (fun1) fun1()end
funOne(function (x)print(“abc”)end)
同理,当一个函数作为另一个函数的返回值的时候,也是可以作为匿名函数的。当让这种情况基本都和闭包思想一起使用的。
下面来浅谈以下闭包的思想:
对闭包解释的原文如下:
从技术上讲,闭包指值而不是函数,函数仅仅是闭包的一个原型声明;尽管如此,在不会导致混淆的情况下我们继续使用属于函数指代闭包
从字面上理解闭包,就是,一个函数内有一个嵌套的函数,这个函数用外部函数的值做了一些事,最后在外部函数 return的位置,返回了这个内嵌函数。
PS:
function fun1 (x)
return function ()
x = x + 1
print(x)
end
end
fun = fun1(1)
用原文的话去解释就是,当fun1执行到return的时候,fun1这个函数已经结束,但是在 return后续的嵌套函数中,调用了超出范围的x变量,这个变量叫做 外部的局部变量。
上面这个例子,进入交互模式之后,用dofile(fun())多次调用就会发现它输出的值在累加。
那么闭包到底是什么呢?
按照目前我的理解,
它类似于c++中的一个类的实例,但是不一样。
闭包就是内嵌函数在使用外部的局部变量之后产生的一个值,这个值能保存自己当前的状态。
还有一点比较注意,在原文中解释闭包的时候,强调的是内嵌函数使用了超出范围的变量。那么正常的情况下,局部变量只有超出了它所在chunk,代码块,函数才算是超出范围,如果仅仅针对函数,那么内嵌函数的位置,是不是永远只能在外部函数return语句的后面。也就是说,要产生一个闭包,必须外部函数返回的是一个函数的值。