Groovy由于提供了Closure的支持,对变量作用域来说,和Java有些不同。
主要体现为两点:
1)Closure对外部局部变量有访问能力;
2)脚本中隐含存在一个binding变量
通过例子来说明:
1)方法屏蔽外部局部变量
String attribute = "bar"
void aMethod(){
assert attribute == "bar" // Not allowed !
}
aMethod()
2)/块内可以访问之前定义的局部变量
String attribute = "bar"
def aClosure = {
assert attribute == "bar" // allowed!
}
aClosure()
3)方法内可以访问 binding 内的变量,即不用def来定义的变量
attribute = "bar"
void aMethod(){
assert attribute == "bar" // allowed ! this value is from binding
assert binding.attribute == "bar"
}
aMethod()
4)方法内定义和binding内同名的局部变量没有问题
attribute = "bar"
void aMethod(){
def attribute = "foo" //allowed !
assert attribute == "foo"
assert binding.attribute == "bar"
}
aMethod()
5)/块内不允许定义同名的局部变量,这个特性应该是个容易忽视的特性,也许是个坏特性,因为这样,块的独立性相对来说被打破了
String attribute = "bar"
def aClosure = {
def attribute = "foo" //not allowed!
}
aClosure()