Определение, которое вы нашли в Интернете, является правильным.
Вот какой-то псевдокод:
i = 1
def foo(j: Int) = {
k = 2
return i + j + k
}
foo(42) // returns 43; value of "i" is preserved inside the function
Функция foo
добавляет значения переменных i
, j
и k
. Переменная j
является аргументом функции, а переменная k
является локальной переменной, определенной внутри тела функции. Но переменная i
приходит извне и называется свободной переменной .
Закрытие - это любая функция, которая "закрывает" одну или несколько свободных переменных . Локальные переменные и аргументы функции больше не нужны после завершения функции, что означает, что весь кадр стека, в котором функция хранит свои переменные, может быть извлечен. Но наличие свободной переменной означает, что кадр стека необходимо сохранить в ОЗУ для будущего использования.
В некоторых языках изменение значения свободной переменной не влияет на локально запомненное состояние соответствующих замыканий, тогда как в других языках изменение видимо. Использование i
и foo
из более ранних версий:
// some languages, e.g. Javascript:
foo(42) // 43
i = 2
foo(42) // 43
// other languages, e.g. Scala:
foo(42) // 43
i = 2
foo(42) // 44
Я не знаю, что твой учитель имел в виду под «значением функции». В функциональном программировании функции - это так называемые «граждане первого класса», что означает, что каждая функция является значением (его можно принять как параметр функции, вернуть из функции, сохранить в коллекциях и т. Д.).