Функция, исполняющаяся единожды

Замкните флаг called и устанавливайте его до вызова исходной функции. Первый вызов выполнит логику, остальные вернут undefined, в том числе при повторном входе из самой функции.

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

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

Замкните флаг called и устанавливайте его до вызова исходной функции. Первый вызов выполнит логику, остальные вернут undefined, в том числе при повторном входе из самой функции.

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

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

Условие

Создайте функцию, реализованную через замыкание, которая допускает единственный вызов. При первом вызове она должна выполнять заданную логику, а при всех последующих возвращать undefined.

Ответ

Замкните флаг called и устанавливайте его до вызова исходной функции. Первый вызов выполнит логику, остальные вернут undefined, в том числе при повторном входе из самой функции.

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

Сохраняются this и аргументы первого вызова. Если он выбросит исключение, флаг останется true: условие говорит о единственной попытке, а не единственном успехе. Для async-функции первый вызов возвращает её Promise, последующие всё равно undefined, как требуется.

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

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

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

Подробнее