根据我的理解randList
,绝对不是闭包(维基百科似乎同意),因为 - 在您提供的代码片段中 - 它仅取决于局部变量(参数也被视为局部变量)。考虑到 的主体randList
,没有所谓的自由变量,即不从当前词法作用域获取值的变量,后者就是方法体本身。len
和n
都是当前词法范围的变量,因为它们都是 . 的封闭定义的参数randList
。
考虑这个例子:
var n = 10
val f = (x: Int) => x + n
println(f(1)) // 11
n = 20
println(f(1)) // 21
该函数f
是一个闭包,因为它不仅依赖于它的参数,而且还依赖于在它自己的词法范围之外声明的变量(即n
)。
维基百科文章提到闭包是由一个函数定义的,以及一个声明自由参数的词法范围。下一个示例说明了这一点:
// n == 20
// f as above
def foo(g: Int => Int) = {
val n = 100
g(1)
}
println(foo(f)) // 21
的结果foo(f)
仍然是21
虽然foo
定义了自己的局部变量n
,但可以假设f
现在使用 this n
。但是,闭包f
与围绕其声明的词法范围耦合,这是评估n
时取值的地方f
。