Разбираем замыкания в JavaScript

В этом мануале вы познакомитесь с замыканиями в JavaScript и узнаете, почему в JavaScript они полезны.

Требования

Чтобы следовать этому мануалу, нужно иметь базовые знания о переменных, функциях, областях действия и обратных вызовах в JavaScript.

Читайте также: Синтаксис и структура кода JavaScript

Что такое замыкание в JavaScript?

Замыкание – это постоянная область действия, удерживаемая переменной. Замыкания поддерживают такие языки, как JavaScript и Ruby. Замыкания позволяют переменным хранить ссылки на их родительскую область видимости даже после того, как их программный блок был выполнен. Замыкание существует, пока такие переменные хранят ссылки.

Рассмотрим следующий пример замыкания:

function outerFunction() {
 let delayed = veryLongOperation();

 let innerFunction = function() { someCallback(delayed); }
}

innerFunction – это функция, которая может получить доступ к родительским элементам области видимости, например к объекту delayed.

Использование замыканий

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

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

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

Рассмотрим следующий пример, в котором определяется класс:

let classExample = function () {
  let randomNumber = Math.floor(Math.random() * 10);

  return function() {
    console.log(randomNumber);
  }
}

Цепочка областей видимости внутренней функции расширена за счет включения членов функции classExample.

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

Замыкания могут использоваться вместе с каррированием для введения приватных членов в классы JavaScript.

function curryingExample() {
  let message = "Hello.";
  return {
    getMessage: function() { console.log('private message', message); }
  };
}

Для примера создайте новый экземпляр curryExample():

let curry = new curryingExample();

Попробуйте получить доступ к message:

console.log('undefined message', curry.message);

Когда console.log(curry.message); выполняется, значение будет undefined.

Теперь попробуйте использовать getMessage():

curry.getMessage();

Когда curry.getMessage(); выполняется, вы получите значение “Hello.”

Заключение

Замыкания – это маленькая, но очень мощная функция JavaScript. Умение работать с замыканиями – важный шаг в карьере любого серьезного разработчика JavaScript.

Более подробное объяснение замыканий можно найти здесь.

Tags:

Добавить комментарий