Вы можете видеть это как обобщение класса.
Ваш класс содержит какое-то состояние. У него есть некоторые переменные-члены, которые могут использовать его методы.
Закрытие - это просто более удобный способ дать функции доступ к локальному состоянию.
Вместо того, чтобы создавать класс, который знает о локальной переменной, которую вы хотите, чтобы функция использовала, вы можете просто определить функцию на месте, и она может неявно обращаться к каждой переменной, которая в данный момент видима.
Когда вы определяете метод-член на традиционном языке ООП, его закрытие - «все члены, видимые в этом классе».
Языки с «правильной» поддержкой замыкания просто обобщают это, поэтому замыкание функции - «все переменные, видимые здесь». Если « здесь » является классом, то у вас есть традиционный метод класса.
Если « здесь » находится внутри другой функции, то у вас есть то, что функциональные программисты считают замыканием. Теперь ваша функция может получить доступ ко всему, что было видно в родительской функции.
Так что это всего лишь обобщение, снятие глупого ограничения, что «функции могут быть определены только внутри классов», но сохранение идеи, что «функции могут видеть любые переменные, видимые в точке, где они объявлены».