之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下
lua的函数是一种 First-Class Value 的东西, 到底是啥?
就是它们与传统类型的变值没啥区别,
可以 存到一个变量中,
可以 存到table中,
可以 作为实参传递给其它函数,
可以 作为其它函数的返回值.
它们还具有特定的词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量.
如下面的例子:
function test(x) return function (value) return value * x end endfunc = test(10)
print( func(11) )
function newCounter() local i = 0 func = function() i = i + 1 return i endreturn func end
c = newCounter() print(c()) print(c())
c1 = newCounter() print(c1()) print(c1())
其实不然, lua 会以 closure 的概念来处理这种情况.
一个 closure 就是一个函数加上该函数所需访问的所有"非局部的变量"
所以上例中 c1, c2 是同个函数所创建的两个不同的 closure, 它们各自拥有局部变量i的独立实例.
从技术上来讲, lua中只有 closure, 而不存在"函数". 因为"函数"本身就是一种特殊的 closure.
后记,C++的类对象不也可以达到类似的效果?
本文向大家介绍C# 中闭包(Closure)详解,包括了C# 中闭包(Closure)详解的使用技巧和注意事项,需要的朋友参考一下 C# 中闭包(Closure)详解 这个问题是在最近一次英格兰 Brighton ALT.NET Beers 活动中提出来的。我发现,如果不用代码来演示,你很难单用话语把它解释清楚,所以,在这里,我打算用 C# 来解释一下什么是闭包(closures)。维基百科上说:
主要内容:在闭包内部修改引用的变量,示例:闭包的记忆效应,示例:闭包实现生成器Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + 引用环境 = 闭包 同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。 图:闭包与函数引用 一个函数类型就像结构体一样,可以被实例化,函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”,
本文向大家介绍Javascript闭包(Closure)详解,包括了Javascript闭包(Closure)详解的使用技巧和注意事项,需要的朋友参考一下 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函
本文向大家介绍JavaScript中的闭包(Closure)详细介绍,包括了JavaScript中的闭包(Closure)详细介绍的使用技巧和注意事项,需要的朋友参考一下 闭包是JavaScript中一个重要的特性,其最大的作用在于保存函数运行过程中的信息。在JavaScript中,闭包的诸多特性源自函数调用过程中的作用域链上。 函数调用对象与变量的作用域链 对于JavaScript中的每
本文向大家介绍学习Javascript闭包(Closure)知识,包括了学习Javascript闭包(Closure)知识的使用技巧和注意事项,需要的朋友参考一下 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 另一方面,在函数外部自然无法读取
本文向大家介绍Lua中的函数浅析,包括了Lua中的函数浅析的使用技巧和注意事项,需要的朋友参考一下 一、函数 在lua中函数的调用方式和C语言基本相同。 如print(“hello world”), z=add(x+y)。唯一的差别是,如果函数只有一个参数,并且该参数是字符串或者table构造器,那么圆括号可以省略,如print “hello world”, f{x=10,y=10}。 我对于ta