什么是闭包?
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 14 课,共 54 课。
你已经学会了函数可以存储在变量中、作为参数传递,也可以由其他函数返回。现在,我们来探索这一点最强大的结果之一:闭包。
当一个嵌套函数会“记住”其外层函数中的局部变量,即使外层函数已经执行完毕时,就会形成闭包。这听起来一开始可能有些奇怪:创建变量的函数执行完毕后,变量怎么还能存在呢?
下面是一个展示这个概念的简单示例:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- 输出:1
print(counter()) -- 输出:2
print(counter()) -- 输出:3调用 createCounter() 时,它会创建一个局部变量 count,并返回一个匿名函数。通常,你会认为 createCounter() 执行完毕后,count 就会消失。但返回的函数仍然可以访问 count。它会“闭包捕获”这个变量。
每次调用 counter() 时,它都会访问并修改同一个 count 变量。这个变量是在 createCounter() 首次运行时创建的。内部函数会携带它的环境,从而在多次调用之间保留状态。
挑战
简单编写一个函数 createMultiplier,用于创建一个带有特定因子的乘法函数,然后立即用它乘以给定的数字。
逻辑:
- 在
createMultiplier内部创建一个嵌套函数,该函数接收一个数字参数 - 嵌套函数应将参数乘以外部函数中的
factor - 嵌套函数会形成闭包,并记住
factor的值 - 使用
number参数调用乘法函数,并返回结果
参数:
factor(数字):乘数number(数字):要相乘的数字
返回值:
number乘以factor的结果(数字)
亲手试试
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- 在下方使用 multiply 函数
end这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器