L1[闭包]01. 函数的传递赋值
没什么说的
1.函数作为变量来看 可以轻松的声明 相互赋值
2.函数变量本质是 一个内存指针 所以函数变量的相互赋值不是传递的函数本身 而是指向这个函数的内存地址
L1[闭包]02. 修改print函数功能
小知识:函数变量相互赋值的一个容易混淆的问题 函数后面的括号问题
function test() print("执行了test函数") end aa=test--不加括号只是函数变量之间的赋值 bb=test()--加了括号表示要执行这个函数 --结果:执行了test函数
L1[闭包]03. table与function
小知识:了解下而已 表内元素是一个函数的推荐写法 其实只要你自己能分清楚就好 怎么写都是可以的
写法一:在普通表上的某个指定元素直接写对应函数的内容 个人习惯如此能尽量避免出现问题和意外
--1 把其他元素都写满 比如key是c的要对应一个函数 其他元素都写上 tempTable={a=1,b="sd",c=1,d=213,e=32} --2 每个元素分层 要写函数的元素对应的内容先写上function () end tempTable={a=1, b="sd", c=function () end, d=213, e=32 } --3 写完表的指定元素对应的函数内容 完毕 tempTable={a=1, b="sd", c=function () return "c" end, d=213, e=32 }
方法二:先声明下表 然后用表元素构建函数即可(推荐)
tempTable={a=1,b="sd",d=213,e=32} tempTable.c=function() return "c" end
123
L1[闭包]04. 定义与调用的顺序
无话可说 看标题就明白 鉴于平时习惯就是把常用函数写到一个独立文件然后用dofile在代码开头调用 或者把函数都写到模块文件 然后在当前代码require开头调用 基本不会出现这个问题 罢了
L1[闭包]05. table自定义排序
小知识:table.sort函数的理解 主要是第二个参数的理解
如果第二个参数是函数 那么这个函数默认是2个参数a,b 分别对应第一个参数表里面的从头开始的2个元素 比如第一次取1 2位 第二次取2 3位依次如此 取到表的元素内容后 进入这个第二个参数对应的函数里面进行某种运算 返回true 则表示无需交换参数1表里面的这2个元素的位置 返回false自然是要交换位置 具体什么情况返回true 什么返回false 看函数内自己定义
aa={10,2,31,14,5,2,234,123} function test(a,b) return a>b--这表示从高到低 反过来你懂的 end table.sort(aa,test) for v,k in pairs(aa) do print(k) end
结果:
234
123
31
14
10
5
2
2
L1[闭包]06. 闭包函数
其实闭包的概念我们之前已经看到很多资料了 这里简单的提提
1.闭包的基本结构
function test() local n=0--外部局部变量 可以理解成C语言下的静态变量 return function () n=n+1 return n end end f=test()--注意test函数的返回内容是一个函数 而且是一个尚未执行的函数 想要获取这个返回函数的结果 还需要在执行一次才可以 print(f())--1 print(f())--2 print(f())--3
2 闭包的常见用途 实现面向对象编程的静态变量概念
3 闭包的几个注意事项
(1.注意返回的是一个函数 但是只是返回函数 并不是执行函数
(2c语言的静态变量的=外部局部变量 基本特性是
- 对于局部变量作用域依旧没有改变,只有定义该局部变量的函数和复合语句可以引用,但是其生命周期变成了直到整个源程序文件结束。
- 对于全局变量生命周期没有发生变化,但是其作用域反而有所减小,只有本文件的函数可以引用该全局变量。
3.是某函数中的局部变量,那么这个变量只被初始化赋值一次,
当这个函数被多次调用时,除第一次被调用时 m 的内容被初始化外,
以后每次调用时,m 都会在上一次函数被调用时产生结果的基础上继续运行的。
123