lua学习日志day03-----闭包思想

在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语句的后面。也就是说,要产生一个闭包,必须外部函数返回的是一个函数的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值