参考: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:环境我也不知道是什么,可以去看看我贴的参考。