Перейти к основному содержимому
Модуль 4 · Урок 4 из 416/32 в курсе~12 min
Уроки модуля (4/4)

Замыкания и область действия

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

Цепочка прицелов

Функция может читать переменные, объявленные вне самой себя, поднимаясь по цепочке областей видимости:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // reads from the closure
}

moltiplicaPer10(3); // 30

Фабрика функций

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

JS
function creaSaluto(prefisso) {
  return function (nome) {
    return `${prefisso}, ${nome}!`;
  };
}

const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');

ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'

Каждый вызов creaSaluto создает отдельную область со своей собственной prefisso.

Счетчик с частным состоянием

Классический пример: закрытие, которое удерживает счетчик, не выставляя его наружу.

JS
function creaContatore() {
  let n = 0;
  return function () {
    n++;
    return n;
  };
}

const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3

const c2 = creaContatore();
c2(); // 1  ← isolated state!

n является частным: никто за пределами замыкания не может его прочитать или изменить.

Попробуйте это

Упражнение#js.m4.l4.e1
Попыток: 0Загрузка…

Реализуйте фабрику makeCounter(), которая возвращает функцию: каждый вызов функции возвращает прогрессивное целое число, начиная с 1. Различные счетчики должны быть независимыми.

Загрузка редактора…
Показать подсказку

Объявите n с помощью let внутри makeCounter, а затем верните функцию, которая выполняет ++n.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m4.l4.e2
Попыток: 0Загрузка…

Реализуйте makeAdderWith(base)`, которая возвращает функцию: по заданному числу n она возвращает основание + n. Каждый сумматор запоминает свою базу.

Загрузка редактора…
Показать подсказку

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

Решение доступно после 3 попыток