- --[===[闭包
- 一个函数中嵌套子函数,子函数可以使用父函数中的局部变量,这种行为就是“闭包”。
- 可以简略归纳为:闭包=函数+引用环境]===]
- -- 无参数闭包
- function Fun()
- local i = 0 -- i 变量,称为内嵌函数的“upValue”。这里的i 变量即不是全局变量,也不是局部变量。
- -- 这里的称为“非局部变量”
- print("-- A步骤 -- i=",i)
- return function() -- 内部嵌入的匿名函数,
- print("-- B步骤 -- i=",i)
- i = i+1
- print("-- C步骤 -- i=",i)
- return i
- end
- end
- -- 调用测试
- f1 = Fun()
- print('调用一次',f1())
- print('调用二次',f1())
- print('调用三次',f1())
- --[===[输出结果:
- [2021:08:21-16:35:19:384] [函数进阶-闭包函数.lua 行号:9] -- A步骤 -- i= 0
- [2021:08:21-16:35:19:385] [函数进阶-闭包函数.lua 行号:11] -- B步骤 -- i= 0
- [2021:08:21-16:35:19:386] [函数进阶-闭包函数.lua 行号:13] -- C步骤 -- i= 1
- [2021:08:21-16:35:19:387] [函数进阶-闭包函数.lua 行号:20] 调用一次 1
- [2021:08:21-16:35:19:388] [函数进阶-闭包函数.lua 行号:11] -- B步骤 -- i= 1
- [2021:08:21-16:35:19:389] [函数进阶-闭包函数.lua 行号:13] -- C步骤 -- i= 2
- [2021:08:21-16:35:19:390] [函数进阶-闭包函数.lua 行号:21] 调用二次 2
- [2021:08:21-16:35:19:391] [函数进阶-闭包函数.lua 行号:11] -- B步骤 -- i= 2
- [2021:08:21-16:35:19:392] [函数进阶-闭包函数.lua 行号:13] -- C步骤 -- i= 3
- [2021:08:21-16:35:19:393] [函数进阶-闭包函数.lua 行号:22] 调用三次 3
- ]===]
- --[===[闭包的特点:
- 闭包中内嵌函数可以访问外部函数已经创建的所有局部变量,这些变量称为内嵌函数的“upValue”。
- 闭包与一般函数的区别:
- 闭包只是在形式上和表现上像函数,但是实际上不是函数。函数只有一个实例,定义后逻辑就确定了,不会执行时发生变化。 ]===]
- -- 带参数的闭包
- function FunWithPara(i)
- print("步骤 1 ,i=",i)
- return function() -- 内嵌匿名函数
- print("步骤 2 ,i=",i)
- i = i+1
- print("步骤 3 ,i=",i)
- return i
- end
- end
- fun2 = FunWithPara(10)
- print(fun2()) -- 输出结果:11
- print(fun2()) -- 输出结果:12
- print(fun2()) -- 输出结果:13
- print(fun2()) -- 输出结果:14
- --[===[输出结果:
- [2021:08:21-16:37:19:177] [函数进阶-闭包函数.lua 行号:42] 步骤 1 ,i= 10
- [2021:08:21-16:37:19:180] [函数进阶-闭包函数.lua 行号:44] 步骤 2 ,i= 10
- [2021:08:21-16:37:19:183] [函数进阶-闭包函数.lua 行号:46] 步骤 3 ,i= 11
- [2021:08:21-16:37:19:184] [函数进阶-闭包函数.lua 行号:52] 11
- [2021:08:21-16:37:19:186] [函数进阶-闭包函数.lua 行号:44] 步骤 2 ,i= 11
- [2021:08:21-16:37:19:187] [函数进阶-闭包函数.lua 行号:46] 步骤 3 ,i= 12
- [2021:08:21-16:37:19:189] [函数进阶-闭包函数.lua 行号:53] 12
- [2021:08:21-16:37:19:190] [函数进阶-闭包函数.lua 行号:44] 步骤 2 ,i= 12
- [2021:08:21-16:37:19:193] [函数进阶-闭包函数.lua 行号:46] 步骤 3 ,i= 13
- [2021:08:21-16:37:19:194] [函数进阶-闭包函数.lua 行号:54] 13
- [2021:08:21-16:37:19:197] [函数进阶-闭包函数.lua 行号:44] 步骤 2 ,i= 13
- [2021:08:21-16:37:19:200] [函数进阶-闭包函数.lua 行号:46] 步骤 3 ,i= 14
- [2021:08:21-16:37:19:201] [函数进阶-闭包函数.lua 行号:55] 14
- ]===]
- -- 具备多个内嵌函数的闭包
- -- 本实例中,两个内嵌函数,对upValues 数值进行共享处理。
- 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() -- 输出结果:10
- res2() -- 输出结果:
- res1() -- 输出结果:110
- -- 带参数的内嵌函数
- function Fun4(num)
- return function(value) -- 内嵌函数带有参数
- --return num * value -- 此写法不能保存内部状态
- num = num*value
- return num
- end
- end
- -- 调试测试
- fun4 = Fun4(10)
- print(fun4(3)) -- 输出结果:30
- print(fun4(3)) -- 输出结果:90
- print(fun4(3)) -- 输出结果:270
- -- 演示闭包可以具备多个实例。
- function Fun5()
- local i = 0
- return function()
- i=i+1
- return i
- end
- end
- -- 调用测试
- res5_1 = Fun5()
- print(res5_1()) -- 输出结果:1
- print(res5_1()) -- 输出结果:2
- print(res5_1()) -- 输出结果:3
- res5_2 = Fun5()
- print(res5_2()) -- 输出结果:1
- print(res5_2()) -- 输出结果:2
- print(res5_2()) -- 输出结果:3
- --[===["词法域"概念
- 若将一个函数写在另一个函数内,那么这个位于内部的函数变可以访问,外部函数中的局部变量,
- 这项特征称之为“词法域”。外部函数中的局部变量在匿名函数内既不是全局变量,也不是局部
- 变量,将其称之为“非全局变量”(upValue)。
- 闭包的典型应用:
- “迭代器”的实现可以借助闭合函数实现,闭合函数能保持每次调用之间的一些状态。 ]===]
- -- 使用闭包技术开发自己的“迭代器”
- -- 自定义“迭代器”(闭包)
- function Itrs(tabArray)
- local i = 0
-
- return function()
- i = i+1
- return tabArray[i]
- end
- end
- -- 定义一个表
- myTab = {1,2,3,5,4,6,7,10,30,60,88}
- -- 迭代输出
- 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
- --[===[
- 闭包的功能与作用总结:
- 1、开发自定义“迭代器”函数。
- 2.扩展了现有函数的功能。
- 3、扩展了命名空间
- ]===]
复制代码
|