1. Реализовать функцию-декоратор runOnce, которая принимает функцию и вызывает какую-нибудь. Новая функция может быть вызвана только один раз, все последующие вызовы возвращают undefined.

Отметьте первый вызов до выполнения исходной функции; затем возвращайте undefined при любом повторном обращении.

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

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

Отметьте первый вызов до выполнения исходной функции; затем возвращайте undefined при любом повторном обращении.

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

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

Условие

  1. Реализовать функцию-декоратор runOnce, которая принимает функцию и вызывает какую-нибудь. Новая функция может быть вызвана только один раз, все последующие вызовы возвращают undefined.

  2. Оформленная функция может принимать аргументы и возвращать результат.

Ответ

Отметьте первый вызов до выполнения исходной функции; затем возвращайте undefined при любом повторном обращении.

Так сохраняются аргументы и this, а повторный вход из самой функции не запускает её ещё раз.

function runOnce(fn) {
  let called = false;
  return function (...args) {
    if (called) return undefined;
    called = true;
    return fn.apply(this, args);
  };
}

Первый результат возвращается только первому вызову, не кешируется для следующих. Даже если функция бросила ошибку или вернула отклонённый Promise, повторного запуска по этому контракту нет.

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

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

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

Подробнее