Функциональное программирование: что такое концепция замыкания? (JavaScript/TypeScript)

Apr 01 2023
Всякий раз, когда мы пишем код, мы пишем функции. Функция — это многократно используемый блок кода, который можно вызывать где угодно.
Фото Кристины Готтарди на Unsplash

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

Когда мы вызываем функцию, мы можем предоставить ей входные данные в качестве аргументов, она запускает код и возвращает результат.

Что такое концепция закрытия?

Концепция замыкания — это объявление функции внутри другой функции. Эта концепция дает возможность внутренней функции получать доступ к состояниям внешней функции (например, к переменным и аргументам).

Давайте посмотрим пример кода

const outerFunction = () => {
  const state = 10;

  const printState = () => {
    console.log(state);
  };

  printState();
};

outerFunction(); // print : 10

Объявление функции внутри другой позволяет нам написать некоторый код и объявить, что делает этот код, назвав функцию. Преимущество в том, что наш код становится более декларативным. Теперь мы знаем, что делает наш код, читая имя функции, а не сам код.

Код без закрытия

давайте посмотрим код без закрытия

const getFileSeparatorByOs = (os: 'linux' | 'windows', enableOsCheking = true) => {
  if (enableOsCheking) {
    if (os === 'linux') {
      return '/';
    }
    if (os === 'windows') {
      return '\\'
    }
  } else {
    return '/'
  }
};

const linuxSeparator = getFileSeparatorByOs('linux');
console.log(linuxSeparator);

const windowsSeparator = getFileSeparatorByOs('windows');
console.log(windowsSeparator);

const defaultSeparator = getFileSeparatorByOs('windows', false);
console.log(defaultSeparator);

Этот код на самом деле не сложен для понимания, но мы можем сделать его более декларативным (легким для чтения).

Код с закрытием

давайте посмотрим код без закрытия

const getFileSeparatorByOs = (os: 'linux' | 'windows', enableOsCheking = true) => {
  const getLinuxSeparator = () => '/';
  const getWindowsSeparator = () => '\\';
  const getDefaultSeparator = () => '/';
  
  if (enableOsCheking) {
    if (os === 'linux') {
      return getLinuxSeparator();
    }
    if (os === 'windows') {
      return getWindowsSeparator();
    }
  } else {
    return getDefaultSeparator();
  }
};

const linuxSeparator = getFileSeparatorByOs('linux');
console.log(linuxSeparator);

const windowsSeparator = getFileSeparatorByOs('windows');
console.log(windowsSeparator);

const defaultSeparator = getFileSeparatorByOs('windows', false);
console.log(defaultSeparator);

Заключение

Концепция замыкания заключается в объявлении функции внутри другой, чтобы предоставить ей доступ к состояниям внешней функции.

Если вы увлечены функциональным программированием, вот моя статья о функции каррификации https://link.medium.com/JAoSkvB3Byb

Если эта статья была вам полезна, пожалуйста, поставьте лайк. И, если вам нравятся концепции программирования, которые позволяют писать чистый код, подпишитесь сейчас, чтобы ничего не пропустить.