为什么groovy闭包引用for循环迭代计数器

为什么groovy闭包引用for循环迭代计数器,groovy,closures,Groovy,Closures,我想知道为什么下面两个代码段会输出不同的结果。看起来迭代计数器是闭包处理的特殊情况 int i = 1 def closures = (1..3).collect { return { println i; ++i } } for (int j = 0; j < 3; ++j) { closures += { println j } } closures*.call() 1 2 3 3 3 3 inti=1 def闭包=(1..3)。收集{ 返回{println i

我想知道为什么下面两个代码段会输出不同的结果。看起来迭代计数器是闭包处理的特殊情况

int i = 1
def closures = (1..3).collect {
    return { println i; ++i }
}

for (int j = 0; j < 3; ++j) {
    closures += { println j }
}

closures*.call()

1
2
3
3
3
3
inti=1
def闭包=(1..3)。收集{
返回{println i;++i}
}
对于(int j=0;j<3;++j){
闭包+={println j}
}
闭包*.call()
1.
2.
3.
3.
3.
3.

这是一个何时更新变量的问题

在第一个示例中,
i
仅在执行闭包时递增,因此即使每个闭包都绑定到相同的
i
实例,每个输出都是不同的

在第二个示例中,
j
在闭包外递增,因此在运行闭包时,
for
循环已完成,
j
的值为
3