lua 闭包

参考:https://www.cnblogs.com/yyxt/p/3875185.html

function和闭包的闲聊:

function:大家都是咸鱼,有什么区别?

闭包:即使我是咸鱼,我也是有梦想的咸鱼。

function:。。。。。。。

function和闭包极为相似,甚至有定义认为闭包就是携带了外部局部变量的函数。从广义上来说是可以这样理解的。但实际上并非如此。

  其实更为准确的定义是,闭包=函数+外部局部变量+环境。函数是其中一部分。

  外部局部变量:内嵌函数对应的外套函数的局部变量。

代码如下:

--闭包
function Test()
	local temp = 1  --外部局部函数
	local function TestFunc()
		temp = temp + 1
		print(temp)
	end 
	return TestFunc
end 

local aTest = Test()--对象1
local bTest = Test()--对象2
aTest()
aTest()
bTest()

执行结果如下:


         结合代码,Test中的局部变量就是闭包函数TestFunc的外部局部变量。

从上面的运行结果来看,aTest第一次运行时,照理来说并没有传入temp,应该是打印nil的。但是因为闭包,执行Test结束时,Test的temp虽然被销毁了,但是aTest闭包却在Test执行结束时保存了一份temp,也就是aTest携带了一个外部局部变量。如此当执行aTest时候,就不会出现打印为nil的情况。

其实也可以理解为当你创建Test的内嵌函数时,就已经产生了一种新的闭包“类型”,当调用Test()时,就会创建对象。如此aTest和bTest都可以视为创建的两个对象。

第二次执行aTest时,打印的是3。是因为第一次执行的是对象aTest,第二次执行的也是aTest,必然会存在加一的操作。

而执行bTest时,为什么没有变成4呢?因为,aTest和bTest是两个互不干扰的对象,两个都各自开辟一个空间来储存了外部局部变量temp,故而互不干涉。

总结,闭包可以认为是一种新的类,这个类型中有函数有外部局部变量有环境,一旦创建了内嵌函数,这个闭包类便创建完成。有了这个闭包类,可以创建很多的闭包对象。若说闭包和函数的区别,有点像是函数披上了隐形的翅膀,乍看之下确实是函数,但其实不然。

ps:环境我也不知道是什么,可以去看看我贴的参考。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值