Замыкания

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

function getCounter() {
  let counter = 0;

  // создание замыкания
  return function() {
    return counter++;
  }
}

let count = getCounter();
count(); // 0
count(); // 1
count(); // 2

У замыкания своя область видимости, в которой уже задано значение переменной. Поэтому значение переменной не сбрасывается после повторного вызова функции getCounter().