Введём сначала функцию высшего порядка changeBalance(). Это функция, которая возвращает другую функцию:
Внутри объявим переменную balance, которая изначально будет равна 0:
И вернём из этой функции новую анонимную функцию, в которую мы передадим аргументом sum и в результате изменим balance на эту сумму:
Теперь посмотрим на ту магию, которая нам позволяет делать замыкание в случае такого использовании функции.
Создадим константу change, которая будет вызовом функции changeBalance(). change теперь станет функцией, которую мы описали выше. То есть функцией, которая примет sum и поменяет balance:
Давайте теперь посмотрим на её поведение, когда попытаемся вызвать эту функцию. Чтобы посмотреть на результат после изменения баланса выведем его в консоль:
Посмотрим что же будет происходить. Вызываем change и передаем ей параметры:
Вывод в консоль:
И вот тут начинает работать замыкание. Несмотря на то, что мы уже вернули функцию и она находится в глобальном контексте, мы все равно можем изменять внутри переменную balance. И более того, от вызова к вызову, наш баланс сохраняется и мы можем его менять.
Теперь на этом примере детально рассмотрим как все это работает по шагам. И как раз поймем где же находится это замыкание и что это.
Полный код: