包含python闭包函数优势的词条( 三 )


{ 参数 -
代码...
}
参考下面的例子代码,定义了c1和c2两个闭包,并对它们进行调用:
def c1 = { println it }
def c2 = { text - println text }
c1.call("content1") //用call方法调用闭包
c2("content2") //直接调用闭包
“-;”之前的部分为闭包的参数,如果有多个参数,之间可用逗号分割;“-;”之后的部分为闭包内的程序代码 。如果省略了“-;”和它之前的部分,此时闭包中代码,可以用名为“it”的变量访问参数 。
闭包的返回值和函数的返回值定义方式是一样的:如果有return语句 , 则返回值是return语句后面的内容;如果没有return语句,则闭包内的最后一行代码就是它的返回值 。[1]
环境表达编辑
在Javascript中闭包(Closure)
什么是闭包
“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数) , 因而这些变量也是该表达式的一部分 。
相信很少有人能直接看懂这句话,因为他描述的太学术 。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包 , 因为跳过闭包的创建过程直接理解闭包的定义是非常困难的 。看下面这段
代码
1
2
3
4
5
6
7
8
9
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();
特点
这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b 。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1) 。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包 。
作用
简而言之 , 闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量 。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程 。
在上面的例子中,由于闭包的存在使得函数a返回后 , a中的i始终存在 , 这样每次执行c(),i都是自加1后alert出i的值 。
那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了 。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收 。(关于Javascript的垃圾回收机制将在后面详细介绍)
另一个例子
模拟私有变量
function Counter(start){
var count = start;
return{
increment:function(){
count++;
},
get:function(){
return count;
}
}
}
var foo =Counter(4);
foo.increment();
foo.get();// 5
结果
这里,Counter 函数返回两个闭包,函数 increment 和函数 get 。这两个函数都维持着 对外部作用域 Counter 的引用,因此总可以访问此作用域内定义的变量 count.
文法
objective c的闭包(block)
objective c 中的的闭包,是通过block实现的 。Apple在C,Objective-C和C++中扩充了Block这种文法的,并且在GCC4.2中进行了支持 。你可以把它理解为函数指针,匿名函数,闭包 , lambda表达式,这里暂且用块对象来表述,因为它们之间还是有些许不同的 。
声明一个块

推荐阅读