Lua中的函数能够在调用之间存储局部变量吗?

我正在阅读《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() 应该返回 1,因为 inewCounter() 函数开始时初始化为零。但看起来,代码中的这一行

local i = 0

在调用 c1() 时被跳过了。newCounter() 函数的行为像对象而不像函数。我知道 Scheme 和 C# 一些,所以我熟悉一级函数。函数返回函数对我来说没问题,但它是如何在调用之间存储 i 的值的?

点赞
用户1009479
用户1009479

这是“常规”函数和 闭包 之间的区别。

对于匿名函数,i 不是局部变量,也不是全局变量。它被称为非局部变量。请注意,当您执行匿名函数时,i 超出了作用域:

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

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

2015-04-30 08:20:28
用户3435777
用户3435777

你可以把 i 视为全局变量,只有 C1 可见。

2015-04-30 10:33:39