MyClass myClass = new MyClass() def closure = new MyClass().outerClosure closure()
运行上面程序,可以发现,闭包内的 this 指向的定义该闭包的类的实例对象(即:上下文)。在闭包内引用的变量和方法都会绑定到 this,其负责处理任何方法调用,以及对任何属性的访问。如果 this 无法处理,则转向 owner,最后在转给 delegate,如果再找不到,那么就会抛出异常。这就是 groovy 提供的默认的策略 this -> owner -> delegate
def run() { def data = [x:10, y:20] def cl = { y = x + y } cl.delegate = data cl() println x println y println data } }
new Test().run()
结果:
1 2 3
300 700 [x:10, y:20]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classTest { def x = 300 def y = 400
def run() { def data = [x:10, y:20] def cl = { y = x + y } cl.delegate = data cl.resolveStrategy = Closure.DELEGATE_FIRST cl() println x //这里不是在闭包中,访问的 x 当然还是成员变量了 println y println data // 主要是 data,在闭包中期访问的 x 和 y 均是 data 中,所以其 y 变成了 10+20; } }