39 631 subscriber

Два полезных примера с замыканиями

<100 full reads

Для тех, кто хочет чего-то необычного

Два полезных примера с замыканиями

В прошлой статье мы разобрали, что такое замыкание в программировании и зачем оно нужно. Сегодня будет практика — добавим замыкания в свои программы.

Делаем форматированый лог

Часто при отладке программы или для ведения логов в JavaScript используют команду console.log (). Она берёт строку из скобок и просто выводит её на экран, а такие сообщения называются логом. Но иногда бывает так, что нужно вывести ещё порядковый номер каждого сообщения и время, прошедшее с загрузки скрипта.

Если пойти стандартным путём, можно сделать так: завести функцию, которая выводит в лог сообщение, и глобальные переменные, где хранится служебная информация:

Два полезных примера с замыканиями

Но у такого подхода есть два минуса:

  • в нём используется глобальная переменная, которую может поменять любая другая функция;
  • и нам нужно передавать при вызове каждый раз много параметров.

Вторую проблему можно решить, перенеся код вычисления даты и номера внутрь функции, но первую проблему это всё равно не решит.

Если сделать то же самое на замыканиях, то и код получится проще, и вызывать станет удобнее. А заодно решится проблема с глобальной переменной — их просто не будет, а значит, меньше шансов, что другая функция их случайно поменяет.

Два полезных примера с замыканиями

Приватные переменные без ООП

В объектно-ориентированном программировании часто пользуются приватными переменными и методами — к ним можно получить доступ только внутри класса, а снаружи этого сделать не получится. С приватными переменными можно работать только по определённым правилам — это сильно уменьшает риск ошибки при работе программы или при обработке данных.

Работа с приватными переменными похожа на обслуживание в банке или МФЦ — нельзя подойти к окошку и обслужиться без талона, нужно его обязательно получить в автомате на входе.

В ООП всё просто: создаётся класс, в котором с помощью символа # обозначается такая переменная, и пишутся методы, которые позволяют с ней работать:

Два полезных примера с замыканиями

Но что если мы не хотим работать в ООП-стиле и не хотим использовать классы? В этом случае можно сделать всё то же самое на замыканиях — и методы, и приватные переменные:

Два полезных примера с замыканиями

Получается, что с замыканиями мы можем получить некоторые возможности ООП, не используя классы и логику работы с объектами.