Lua学习笔记:浅谈对闭包的认识

前言
本篇在讲什么

我们从几个方面简单认识和理解lua的闭包
本篇适合什么

适合初学Lua的小白
本篇需要什么

Lua语法有简单认知
依赖Lua5.1的环境
依赖Sublime Text3编辑器

本篇的特色

具有全流程的图文教学
重实践,轻理论,快速上手
提供全流程的源码内容


★提高阅读体验★

👉 ♠ 一级标题 👈

👉 ♥ 二级标题 👈

👉 ♣ 三级标题 👈

👉 ♦ 四级标题 👈


♠ 什么是闭包

  • 闭包就是能够读取其他函数内部变量的函数

  • 可以理解为,闭包就是定义在函数内部的函数

  • 本质上,闭包是将函数内部和函数外部连接起来的桥梁

例:以下述代码为例

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

♠ 结语

若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。

👉 本文属于原创文章,转载请评论留言,并在转载文章头部著名作者出处👈
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值