A function may refer to variables and constants of its outer scopes in which it is defined. It is called a closure, because it is closing over those variables and constants. A closure can can read from the variables and constants and assign to the variables it refers to.
// Declare a function named `makeCounter` which returns a function that
// each time when called, returns the next integer, starting at 1.
//
fun makeCounter(): ((): Int) {
var count = 0
return fun (): Int {
// NOTE: read from and assign to the non-local variable
// `count`, which is declared in the outer function.
//
count = count + 1
return count
}
}
let test = makeCounter()
test() // is `1`
test() // is `2`