Реализуйте функцию memo(fn, lifetime), которая возвращает новую функцию и кэширует результат исходной функции без аргументов на заданное время жизни в миллисекундах. Нужно кэшировать один последний результат, без ключей и Map; повторный вызов в пределах lifetime должен вернуть кэшированный результат.

Храните значение, флаг наличия кеша и время истечения в замыкании; отдельный флаг позволяет кешировать даже undefined.

Короткий ответ

Что ответить на собеседовании

Храните значение, флаг наличия кеша и время истечения в замыкании; отдельный флаг позволяет кешировать даже undefined.

Подробный разбор

Ответ с пояснениями

Храните значение, флаг наличия кеша и время истечения в замыкании; отдельный флаг позволяет кешировать даже undefined.

Вариант для синхронной функции без аргументов: TTL считается после вычисления, исключения не кешируются. lifetime = 0 отключает повторное использование. Кеш общий для одной созданной обёртки.

function memo(fn, lifetime) {
  if (!Number.isFinite(lifetime) || lifetime < 0) throw new RangeError('TTL');
  let valid = false, value, expires = 0;
  return function () {
    if (valid && performance.now() < expires) return value;
    value = fn.call(this);
    expires = performance.now() + lifetime;
    valid = true;
    return value;
  };
}

Для асинхронной функции нужно отдельно согласовать кеширование promise и отказов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее