Что такое замыкание (closure) в программировании, и как оно используется?

Замыкание (closure) — это функция или объект, которые «захватывают» переменные из своего внешнего контекста. Это позволяет функции использовать и изменять эти переменные даже после того, как контекст, в котором они были объявлены, вышел из области видимости. Замыкания широко используются для создания функций обратного вызова (callback), а также для реализации инкапсуляции и управления состоянием.

Пример на JavaScript:

function makeCounter() {
    let count = 0;

    return function() {
        count++;
        return count;
    };
}

const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3

В этом примере функция makeCounter создает и возвращает внутреннюю функцию, которая увеличивает и возвращает значение переменной count. Переменная count сохраняется в замыкании и доступна внутренней функции даже после завершения выполнения makeCounter.

Применение замыканий:

  1. Создание приватных переменных: Замыкания позволяют создавать функции с приватными переменными, которые недоступны из внешнего контекста.
   function createPerson(name) {
       return {
           getName: function() {
               return name;
           },
           setName: function(newName) {
               name = newName;
           }
       };
   }

   const person = createPerson('Alice');
   console.log(person.getName()); // Alice
   person.setName('Bob');
   console.log(person.getName()); // Bob
  1. Функции обратного вызова (callbacks): Замыкания часто используются для создания функций обратного вызова, которые сохраняют контекст выполнения.
   function delayedGreeting(name) {
       setTimeout(function() {
           console.log(`Hello, ${name}!`);
       }, 1000);
   }

   delayedGreeting('Alice'); // Через 1 секунду: Hello, Alice!
  1. Мемоизация: Замыкания позволяют запоминать результаты вычислений для повышения производительности.
   function memoize(fn) {
       const cache = {};
       return function(arg) {
           if (cache[arg]) {
               return cache[arg];
           } else {
               const result = fn(arg);
               cache[arg] = result;
               return result;
           }
       };
   }

   const factorial = memoize(function(n) {
       return n <= 1 ? 1 : n * factorial(n - 1);
   });

   console.log(factorial(5)); // 120

Замыкания — это мощный инструмент, который делает код более гибким и управляемым.

Закладка Постоянная ссылка.

Обсуждение закрыто.