我正在阅读"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调用之间的值?
这是"正常"函数和闭包之间的区别.
对于匿名函数,i它不是局部变量,也不是全局变量.它被称为非局部变量.请注意,i执行匿名函数时超出范围:
print(c1()) --> 1
print(c1()) --> 2
Run Code Online (Sandbox Code Playgroud)
这里的要点是,价值i被存储在匿名函数.函数和所有非局部变量一起构成一个闭包.