1 class a { 2 def v1 = "v1 in a" 3 static def v2 = "v2 in a" 4 def v4 = "v4 in a" 5 def v5 = "v5 in a" 6 def va = "va in a" 7 def b() { 8 def v1 = "v1 in a.b()" 9 def v2 = "v2 in a.b()"10 def v4 = "v4 in a.b()"11 def g = {12 def v0 = "v0 in closure g"13 def h = {14 //function b里面已经定义v4 = "v4 in a.b()"所以下面这行15 //报错:The current scope already contains a variable of the name v416 //def v4 = "v4 in closure h"17 }18 }19 def c = {20 //下面的这行代码报错:The current scope already contains a variable of the name v121 //def v1 = "v1 in closure c"22 println v123 println owner24 println this25 //下面这行定义v5变量正常,输出的结果也是:v5 in closure c26 def v5 = "v5 in closure c"27 println v5//v428 println va29 }30 println "***" + c.toString() + "***"31 c()32 33 return "b func"34 }35 36 def d = {37 println v1;38 println v2;39 println v4;40 def v5 = "v5 in closure d"41 println v542 }43 44 def e = {45 def v1 = "v1 in closure e"46 def f = {47 //下面这行代码报错:The current scope already contains a variable of the name v148 //def v1 = "v1 in closure f"49 println v150 51 //下面这行就没错,因为闭包e的v2是在后面定义的52 def v2 = "v2 in closure f"53 54 //下面这行报错,v3在f里面不可见55 //println v356 57 def vf = "vf in closure f"58 }59 f()60 def v2 = "v2 in closure e"61 def v3 = "v3 in closure e"62 63 //在闭包e里面vf不可见64 //println vf65 }66 }67 def test(x) {68 println "func test start --- x:" + x69 def v1 = 100070 def v2 = 200071 def v3 = 300072 73 x()74 println "func test--- end:"75 }76 test(new a().d)77 println "--------------"78 //println new a().v479 println new a().b()80 new a().e()81 82 83 /*84 通过上面的测试代码可以看出:85 1.在闭包a里面定义的闭包b,那么b中定义的变量不能和和闭包a里面定义的变量名字相同.86 2.在函数a里面定义的闭包b,那么b中定义的变量不能和和函数a里面定义的变量名字相同.87 3.由此也可以推导出:在函数a里面定义闭包b,在闭包b里面定义闭包c,那么c中定义88 的变量也不能和函数a中定义的变量名字相同,对于任意多层闭包嵌套也是如此89 在闭包里面的符号查找方面:90 首先在闭包里面查找,如果闭包里面没有定义,则有两种情况(假设delegate策略是Closure.OWNER_FIRST,其它策略是一样的):91 1.如果这个闭包的外层是函数,则现在函数里面查找,如果函数里面也没有定义,则进入delegate策略即在owner里面查找,92 如果owner里面没有,则在delegate里面查找,ruguo delegate里面没有就报错93 2.如果这个闭包没外层不是函数,则直接进入delegate策略即在owner里面查找,如果owner里面没有,则在delegate里面查找94 如果delegate里面没有就报错.95 96 */