本篇在讲什么 我们从几个方面简单认识和理解lua的闭包 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Lua5.1的环境 依赖Sublime Text3编辑器 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 |
★提高阅读体验★ 👉 ♠ 一级标题 👈👉 ♥ 二级标题 👈👉 ♣ 三级标题 👈👉 ♦ 四级标题 👈 |
目录
- ♠ 什么是闭包
- ♠ lua的闭包
- ♥ 词法定界
- ♥ 第一类值
- ♥ 上值(upvalue)
- ♥ 总结
- ♠ 推送
- ♠ 结语
♠ 什么是闭包
-
闭包就是能够读取其他函数内部变量的函数
-
可以理解为,闭包就是定义在函数内部的函数
-
本质上,闭包是将函数内部和函数外部连接起来的桥梁
例:以下述代码为例
lua方法newCounter
内包含了一个局部变量count
,在作用域的限制下,只有方法体内可以访问count,闭包可是让我们从外部访问count
function newCounter()
local count = 0
end
♠ lua的闭包
首先我们需要了解几个关于Lua语法的特性,对我们理解闭包有帮助
在Lua语言中,函数是严格遵循词法定界
的第一类值
并且函数作为第一类值,能够逃逸出它们变量的原始定界范围
♥ 词法定界
function B()
local b1 = 1
local b2 = 2
function A()
print(b1+b2)
end
end
当编写一个被其他函数B包含的函数A时,被包含的函数A可以访问包含其的函数B的所有局部变量,我们将这种特性称为词法定界
♥ 第一类值
a = {p = print} --> 'a.p'指向print函数
a.p ("Hello World") --> Hello World
print =math.sin --> print现在指向sine函数
a.p(print(1)) --> 0.8414709848079
math.sin = a.p --> sin现在指向print 函数
math.sin(10,20) --> 10 20
Lua 语言中的函数与其他常见类型的值(例如数值和字符串)具有同等权限
程序可以将某个函数保存到变量中(全局变量和局部变量均可)或表中
可以将某个函数作为参数传递给其他函数
♥ 上值(upvalue)
下面我们给出例子,介绍闭包中对于局部变量的使用
function newCounter()
local count = 0
local function _add()
count = count + 1
return count
end
return _add
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
c2 = newCounter()
print(c2()) --> 1
在内部函数
_add
中,使用了其外部函数的局部变量count
, count对于_add方法来说被称为上值(upvalue)
上值一经获取,即被存储在闭包内,并不会随函数执行结束而消失,所以c1多次执行,内部count持续累计
c1,c2 是不同的闭包,它们建立在相同的函数之上,但是各自拥有局部变量 count
的独立实例
♥ 总结
一个闭包就是一个函数,外加能够使该函数正确访问非局部变量所需的其他机制
♠ 推送
- Github
https://github.com/KingSun5
♠ 结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。