Lua中的函数是具有适当词法范围的一级值。

lua作为一级值意味着函数与数字和字符串一样具有值,可以将函数存储在变量或者表中,将函数作为参数传递给其它函数,也可以作为结果返回函数。

lua具有词法范围意味着函数可以访问闭包函数的变量。

表排序table.sort。

network = {{name = "grauna", IP = "210.26.30.34"},{name = "arraial", IP = "210.26.30.23"},{name = "lua", IP = "210.26.23.12"},{name = "derain", IP = "210.26.23.20"}
}table.sort(network, function (a, b) return (a.name > b.name) end)
for k, v in pairs(network) dofor k, v in pairs(v) doprint(k, v)end
end

1、函数作为一类值

以函数作为参数的函数称为高阶函数,如table.sort。高阶函数没有特权,因为lua将函数视为一类值。

function derivative(f, delta)delta = delta or 1e-4return function (x)return (f(x + delta) - f(x)) / deltaend
endc = derivative(math.sin)
print(math.cos(5.2), c(5.2))

2、非全局函数

函数作为一类值,可以在全局变量中存储,也可以在表字段里或者局部变量里存储。

表中函数定义

Lib = {}
Lib.foo = function (x, y) return x + y end
Lib.goo = function(x ,y) return x - y  endprint(Lib.foo(2, 3), Lib.goo(2, 3))

也可在构造中定义

Lib = {foo = function (x, y) return x + y end,goo = function(x ,y) return x - y  end
}print(Lib.foo(2, 3), Lib.goo(2, 3))

也可以定义如下

Lib = {}
function Lib.foo(x, y) return x + y end
function Lib.goo(x ,y) return x - y  end
print(Lib.foo(2, 3), Lib.goo(2, 3))

局部函数定义形式如下:

local function f(params)body
end或者
local f
f = function(params) body end

正确的局部递归函数为

local fact
fact = function(n)if n == 0 then return 1else return n * fact(n - 1)end
endprint(fact(2))

在间接型的局部递归函数时,需要使用前向声明。

local flocal function g() return f()
endfunction f() end

3、词法作用域

当函数中嵌套函数时,嵌套函数可以访问函数中的本地变量。

names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
--table.sort(names, function (n1, n2) return grades[n1] > grades[n2] end)
function sortbygrade(names, grades)table.sort(names, function(n1, n2) return grades[n1] > grades[n2] end)
endsortbygrade(names, grades)
for i = 1, #names doprint(names[i])
end
function newCounter()local count = 0return function()count = count + 1return countend
endc1 = newCounter()
print(c1())
print(c1())

输出为

lua学习笔记之闭包相关推荐

  1. lua 学习笔记---游戏开发第一步

    lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...

  2. Lua学习笔记6:C++和Lua的相互调用

    曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...

  3. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  4. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  5. sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

    sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之 ...

  6. Lua学习笔记(2)

    前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...

  7. lua学习笔记之垃圾收集

    1.弱表 弱表如何声明呢?通过元表字段__mode来声明,其值必须是字符串,"k"表示关键字是弱的,"v"表示值是弱的,"kv"表示键和值都 ...

  8. Lua 学习笔记(一)环境搭建

    Lua是一个小巧的脚本语言.Lua由标准C编写而成,代码简洁,几乎在所有的操作系统和平台上都可以编译,运行. 主要讲一下mac和win下的环境搭建. 工具: 1.Sublime Text 2 2.Lu ...

  9. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

最新文章

  1. 推荐8个私藏已久的实用网站,每一款都能带来惊喜!
  2. leetcode第二题java_LeetCode第二题,Java实现
  3. 从“小”培养AI安全意识:OpenAI开源最新强化学习训练工具,安全约束自由定制,开箱即用...
  4. 二维码QR Code不是一个产品,是一个功能
  5. 个人成长中,关于规划设计的思考
  6. 网络管理员在预先分配和识别作为_网络管理员必备流量分析工具,果断转发收藏!...
  7. (自动重命名论文)PaperDownloader (Chrome插件) + EndNote (附下载链接) + Zotero
  8. 【Kilav】数据库知识点速通 其二
  9. 华为路由器时间同步_系统时间同步的方式
  10. 如何实现用户名或密码错误,弹出重新登录的提示
  11. libmp3lame的接口使用
  12. 干货 | 在搜索引擎广告关键词生成上,算法可以做什么?
  13. 全球及中国中线静脉插管行业研究及十四五规划分析报告
  14. 微信小程序实现类似微信评论区回复组件(mpx)
  15. 网站出现安全证书过期的原因
  16. 空间换时间小例子(2)
  17. vue组件深度传值provide、inject,值类型响应式的方法
  18. 昆石VOS3000_2.1.6.0.0一键安装教程
  19. 一文带你了解typeScript
  20. kermit使用注意事项

热门文章

  1. Go -- 多个go文件包名都是main
  2. cocos2d-x CCParticleSystem粒子系统
  3. 我只会python、怎么搞个软件出来-python---很多行代码做一个自动打开软件的程序...
  4. python画图三维-对python mayavi三维绘图的实现详解
  5. python画-用Python画一颗特别的心送给她
  6. python 自动化-只要十分钟,用Python实现自动化水军评论
  7. python 自动化-Python 接口自动化测试
  8. python自学什么书比较好-有什么好的自学 Python 的书籍推荐?
  9. python语言入门自学-自学编程的6种方法,自学Python
  10. python读取文件第n行-python读取文件第n行