--闭包
--一个函数中嵌套子函数,子函数可以使用父函数中的局部变量,这种行为就是“闭包"。
--闭包的特点:闭包中的内嵌函数可以访问外部函数已经创建的所有局部变量,这些变量
-- 称为该内嵌函数的 “upvalue” 。
--从栈顶取一个变量,和函数关联到一起,做成一个闭包
--若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为“词法域”。
--外部函数中的局部变量在匿名函数内既不是全局变量,也不是局部变量,将其称之为“非全局变量”。
--eg1: 无参数闭包
function Fun()
local i=0 --i 变量 ,称为内嵌函数的 "upValue" 。 这里的i 变量即不是全局变量,也不是局部变量。
-- 这里应该称为“非局部变量”
return function() --内部嵌入的匿名函数,
i=i+1
return i
end
end
----调用测试
f1=Fun() -- 返回一个闭包(上值关联到函数的内嵌函数)
print(f1()) --结果 1
print(f1()) --结果 2
print(f1()) --结果 3
print(f1()) --结果 4
f1=Fun()
print(f1()) --结果 1
----------
--eg2: 带参数的闭包
function FunWithPara(i) --参数i ,是内嵌函数的“upValues”
print("A/ i=",i)
return function() --内嵌匿名函数
print("B/ i=",i)
i=i+1
print("C/ i=",i)
return i
end
end
fun2=FunWithPara(10)
print(fun2())
print(fun2())
print(fun2())
print(fun2())
--eg3: 具备多个内嵌函数的闭包
-- 本示例中,两个内嵌函数,对upVluaes 数值进行共享处理。
function FunMutil()
local numUpValue=10 --这是"up Values"
function InnerFun1() --内嵌函数
print(numUpValue)
end
function InnerFun2()
numUpValue=numUpValue+100
end
return InnerFun1,InnerFun2
end
--调用测试
local res1,res2=FunMutil()
res1() --output: 10
res2() --output:
res1() --output: 110
--eg5: 演示闭包可以具备多个实例。
function Fun5()
local i=0
return function()
i=i+1
return i
end
end
--测试调用
res51=Fun5()
print(res51()) --output: 1
print(res51()) --output: 2
print(res51()) --output: 3
res52=Fun5()
print(res52()) --output: 1
print(res52()) --output: 2
print(res52()) --output: 3
print(res52()) --output: 4
--eg6: 使用闭包技术开发自己的“迭代器”
--自定义“迭代器”(闭包)
function Itrs(tabArray)
local i=0
return function()
i=i+1
return tabArray[i]
end
end
----定义一个表
myTab={10,20,30,55,60,75,88,99,100}
--迭代输出
iterator=Itrs(myTab)
--使用while 输出
while(true) do
local j=iterator()
if(j==nil) then
break
end
print("(while) j=",j)
end
--使用For 输出
for m in Itrs(myTab) do
print("(for): ",m)
end