时间:2021-05-22
之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下
lua的函数是一种 First-Class Value 的东西, 到底是啥?
就是它们与传统类型的变值没啥区别,
可以 存到一个变量中,
可以 存到table中,
可以 作为实参传递给其它函数,
可以 作为其它函数的返回值.
它们还具有特定的词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量.
如下面的例子:
复制代码 代码如下:
function test(x)
return function (value)
return value * x
end
end
func = test(10)
print( func(11) )
在test()中,嵌套了一个匿名函数作为返回值, 而在这个匿名函数中 可以访问外部的 value 变量
再看另一个例子
复制代码 代码如下:
function newCounter()
local i = 0
func = function()
i = i + 1
return i
end
return func
end
c = newCounter()
print(c())
print(c())
c1 = newCounter()
print(c1())
print(c1())
代码中, 函数 func 里访问了一个 "非局部的变量" i, 用于保存一个计数器
初步看,由于创建变量i的函数 newCounter 已经返回, 所以每次调用 func 时, 应该是超过了作用范围
其实不然, lua 会以 closure 的概念来处理这种情况.
一个 closure 就是一个函数加上该函数所需访问的所有"非局部的变量"
所以上例中 c1, c2 是同个函数所创建的两个不同的 closure, 它们各自拥有局部变量i的独立实例.
从技术上来讲, lua中只有 closure, 而不存在"函数". 因为"函数"本身就是一种特殊的 closure.
后记,C++的类对象不也可以达到类似的效果?
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
概述在JavaScript前端开发中,函数与对其状态即词法环境(lexicalenvironment)的引用共同构成闭包(closure)。也就是说,闭包可以让
什么是闭包?简单说,闭包就是根据不同的配置信息得到不同的结果。再来看看专业的解释:闭包(Closure)是词法闭包(LexicalClosure)的简称
本文实例讲述了javascript闭包(Closure)用法。分享给大家供大家参考,具体如下:closure被翻译成“闭包”,感觉这东西被包装的太学术化。下面参
什么是闭包闭包是什么?闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是:闭包就是函数的
简介闭包closure是javascript中一个非常强大的功能。所谓闭包就是函数中的函数,内部函数可以访问外部函数的作用域范围,从而可以使用闭包来做一些比较强