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

cor*_*und 4 lua closures

我正在阅读"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
Run Code Online (Sandbox Code Playgroud)

从我的观点来看,每个调用c1()都应该返回,1因为i在of的开头被初始化为零newCounter().但它看起来像线

local i = 0
Run Code Online (Sandbox Code Playgroud)

在电话中被跳过c1().并且newCounter()表现得像对象不像功能.我对Scheme和C#了解不多,所以我熟悉一流的功能.函数返回函数对我来说没问题,但它如何存储i调用之间的值?

Yu *_*Hao 6

这是"正常"函数和闭包之间的区别.

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

print(c1()) --> 1
print(c1()) --> 2
Run Code Online (Sandbox Code Playgroud)

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