什么是闭包
闭包是一种特殊的函数,它可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。
为了更好地理解闭包,我们可以看一个例子:
function counter()
local count = 0
return function()
count = count + 1
return count
end
end
c1 = counter()
print(c1()) --> 1
print(c1()) --> 2
print(c1()) --> 3
在这个例子中,我们定义了一个函数counter
,它返回一个匿名函数。这个匿名函数可以访问counter
函数中的局部变量count
,即使counter
函数已经返回,count
变量仍然可以被访问和修改。这就是一个闭包。
当我们调用counter
函数时,它会创建一个新的局部变量count
,并返回一个匿名函数。每次调用这个匿名函数时,它会将count
变量加1,然后返回新的值。由于这个匿名函数是闭包,它可以访问count
变量,因此每次调用c1()
时,它都会返回一个递增的值。
闭包的作用非常强大,它可以帮助我们实现一些高级的编程技巧和语言特性,例如函数柯里化、延迟计算、回调函数等。同时,也需要注意闭包可能导致内存泄漏等问题,因此在使用闭包时需要谨慎处理。
count是局部为何累计?
是的,count
是counter
函数中的局部变量,但是由于闭包的特性,内部函数可以访问到外部函数的局部变量。
在这个例子中,当我们调用counter()
函数时,它返回一个匿名函数,这个匿名函数可以访问counter
函数中的局部变量count
,并且这个匿名函数被赋值给变量c1
。因此,每次调用c1()
时,它都会访问count
变量,并将其加1。
由于count
变量是在counter
函数中定义的局部变量,因此它的生命周期与counter
函数的生命周期相同。但是,由于c1
变量持有了这个匿名函数,所以即使counter
函数已经返回,count
变量仍然可以被访问和修改,因此每次调用c1()
时,它都会返回一个递增的值。
这就是闭包的特性。闭包可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。在上面的例子中,匿名函数形成了一个闭包,它可以访问counter
函数中的局部变量count
,即使counter
函数已经返回,count
变量仍然可以被访问和修改。
LClosure的作用
在Lua中,LClosure
是表示Lua函数闭包的一种类型。闭包是一种特殊的函数,它可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。
LClosure
数据结构中包含了一个函数原型(Proto
)和一个环境表(upvalue
),函数原型中存储了函数的指令、常量、局部变量和调试信息等,环境表中存储了函数所需的外部变量,也就是闭包所依赖的变量。
LClosure
的主要作用是实现Lua中的闭包功能。Lua中的闭包非常强大,它允许程序员创建具有动态特性的函数,可以将函数作为值传递给其他函数,可以在函数内部定义函数等。闭包还可以用于实现一些高级的语言特性,例如函数柯里化、延迟计算、回调函数等。
具体来说,当一个函数需要访问其外部的变量时,Lua会将这些变量捕获到闭包中,并将闭包作为函数的环境表。这样,当函数被调用时,它可以使用这些外部变量,即使它们不在函数的作用域内。
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~