Lua 中的函数可以在调用之间存储本地值?

Functions in Lua could store local values between calls?

我正在阅读 "Programming in Lua",但我不理解这段代码中 Lua 中函数的行为:

function newCounter ()
  local i = 0
  return function () -- anonymous function
    i = i + 1
    return i
    end
end

c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2

从我的角度来看,每个调用 c1() 都应该 return 1 因为 inewCounter() 的开头被初始化为零。但它看起来像行

local i = 0

c1() 的调用中被跳过。 newCounter() 表现得像对象而不是函数。略懂Scheme和C#,对first-class函数比较熟悉。函数 return 函数对我来说没问题,但它如何在调用之间存储 i 的值?

这是"normal"函数和闭包之间的区别。

对于匿名函数来说,i不是局部变量,也不是全局变量。它被称为非局部变量。请注意,执行匿名函数时 i 超出范围:

print(c1()) --> 1
print(c1()) --> 2

这里的重点是,i的值在匿名函数中存储。该函数和所有非局部变量一起构成一个闭包。

您可以将 i 视为仅对 C1 可见的全局变量。