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 v4 16 //def v4 = "v4 in closure h" 17 } 18 } 19 def c = { 20 //下面的這行代碼報錯:The current scope already contains a variable of the name v1 21 //def v1 = "v1 in closure c" 22 println v1 23 println owner 24 println this 25 //下面這行定義v5變量正常,輸出的結果也是:v5 in closure c 26 def v5 = "v5 in closure c" 27 println v5//v4 28 println va 29 } 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 v5 42 } 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 v1 48 //def v1 = "v1 in closure f" 49 println v1 50 51 //下面這行就沒錯,由於閉包e的v2是在後面定義的 52 def v2 = "v2 in closure f" 53 54 //下面這行報錯,v3在f裏面不可見 55 //println v3 56 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 vf 65 } 66 } 67 def test(x) { 68 println "func test start --- x:" + x 69 def v1 = 1000 70 def v2 = 2000 71 def v3 = 3000 72 73 x() 74 println "func test--- end:" 75 } 76 test(new a().d) 77 println "--------------" 78 //println new a().v4 79 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 */