【Lua】闭包可能会导致的变量问题

先思考下面这个问题:

lua 复制代码
local function counter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end

local a = counter()
local b = counter()

print(a()) --> ?
print(a()) --> ?
print(b()) --> ?
print(a()) --> ?
 

输出结果:

lua 复制代码
print(a()) --> 1
print(a()) --> 2
print(b()) --> 1
print(a()) --> 3
 

问题1:为什么每一次print(a())的结果都不一致呢?函数体内的count不应该是一个临时变量吗,怎么在调用之前会在上一次调用的结果后进行计算?

分析原因🤔:这是由于闭包引起的,由于return内写的函数里对count有所引用,因此在每次调用完a后,变量count并没有被销毁

问题2:为什么a的值与b的值不会相互影响?

回答🤔:a和b都是由counter()返回的闭包函数实例,它们分别捕获了不同的 count 变量副本,因此它们的计数是相互独立的。

相关推荐
会开花的二叉树26 分钟前
上手 cpp-httplib:轻量级 C++ HTTP 库的安装与实战指南
开发语言·c++·http
周杰伦fans26 分钟前
C# 集合框架完全指南:从IEnumerable到ObservableCollection的深度解析
开发语言·c#
秦禹辰36 分钟前
开源多场景问答社区论坛Apache Answer本地部署并发布至公网使用
开发语言·后端·golang
代码村新手1 小时前
C语言-指针
c语言·开发语言·jvm
s9123601011 小时前
[rust] temporary value dropped while borrowed
开发语言·后端·rust
hbh112233abc1 小时前
PHP使用Imagick库操作tiff
开发语言·php
蓝莓味的口香糖1 小时前
【JS】JS基础-对象处理方法整合
开发语言·前端·javascript
欧的曼1 小时前
cygwin环境下php脚本异常中断后自动重启
开发语言·php
要做朋鱼燕1 小时前
ARM CoreSight:多核SoC调试追踪架构解析
开发语言·笔记·职场和发展·嵌入式·嵌入式软件
從南走到北1 小时前
JAVA露营基地预约户外露营预约下单系统小程序
java·开发语言·小程序