Menu
CoddyTech

什么是闭包?

本课属于 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() 首次运行时创建的。内部函数会携带它的环境,从而在多次调用之间保留状态。

challenge icon

挑战

简单

编写一个函数 createMultiplier,用于创建一个带有特定因子的乘法函数,然后立即用它乘以给定的数字。

逻辑:

  • 在 createMultiplier 内部创建一个嵌套函数,该函数接收一个数字参数
  • 嵌套函数应将参数乘以外部函数中的 factor
  • 嵌套函数会形成闭包,并记住 factor 的值
  • 使用 number 参数调用乘法函数,并返回结果

参数:

  • factor(数字):乘数
  • number(数字):要相乘的数字

返回值:

  • number 乘以 factor 的结果(数字)

亲手试试

function createMultiplier(factor, number)
    local multiply = function(x)
        return x * factor
    end
    
    -- 在下方使用 multiply 函数

end
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Lua 在线编译器