所谓闭包,其实是一种特殊的函数,它在暗地里绑定了函数内部引用的全部变量。换句话说,这种函数(或方法)把它引用的全部东西都放在一个上下文里“包”起来了。闭包
Groovy语言中闭包绑定的简单示例函数
class Employee{ def name,salary }
def paidMore(amount){ return {Employee e -> e.salary > amount} }
isHighPaid = paidMore(100000)
执行闭包spa
def Smithers = new Employee(name:"Fred", salary:120000) def Homer = new Employee(name:"Homer", salary:80000) println isHighPaid(Smithers) println isHighPaid(Homer) // true, false
绑定另外一个闭包code
isHigherPaid = paidMore(200000) println isHigherPaid(Smithers) println isHigherPaid(Homer) def Burns = new Employee(name:"Monty", salary:1000000) println isHigherPaid(Burns) // false, false, true
闭包的原理blog
def Closure makeCounter(){
def local_variable = 0 return { return local_variable += 1 //[1] } c1 = makeCounter() //[2] c1() //[3] c1() c1() c2 = makeCounter() //[4] println "C1 = ${c1(),C2 = ${c2()}" //output: C1 = 4, C2 = 1 //[5]
[1]函数的返回值是一个代码块,而不是一个值。it
[2]c1如今指向代码块的一个实例。class
[3]调用c1将递增其内部变量,若是这个时候输出,其结果会是1。变量
[4]c2如今指向makeCounter()的一个全新实例,与其余实例没有关联。原理
[5]每一个实例的内部状态都是独立的,各自拥有一份local_variable。引用