我有这段代码,我想知道变量x
的值在定义时是否被函数捕获,或者函数是否捕获到对变量本身的引用(或者还有其他东西)?
如果x
是val
,那么一切的处理方式会不会有所不同?
// Kotlin
var x = 1
fun f(y: Int) = x + y // Function adds 1 to a given Int
x = 2
val y = 3
val z = f(x + y) // Calls f with argument of 5
// z now maps to 7
// Swift
var x = 1
func f(_ y: Int) -> Int {return x + y} // Function adds 1 to a given Int
x = 2
let y = 3
let z = f(x + y) // Calls f with argument of 5
// z now maps to 7
所以无论何时调用函数f
,我们都要在函数定义的环境中计算它的主体{ x + y }
.当我们定义这个函数时,我们有一个环境,x == 1
.
因此函数f
总是在其参数上加1,无论它在哪里调用.这是规矩.(这是let
/val
,不是var
)
我的问题是关于var
的函数闭包.
只要给我一个详细的解释(按照作用域链在内存中定位变量),谢谢.