> Как реализовать функцию-обертку runOnce в JavaScript, вызывающую функцию только один раз? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

В JavaScript функцию-обёртку runOnce можно реализовать с помощью замыкания. Она гарантирует, что переданная функция выполнится только один раз, а при последующих вызовах будет возвращать результат первого вызова (или undefined, если результат не нужен).

JAVASCRIPT
function runOnce(fn) {
let executed = false;
let result;
return function(...args) {
if (!executed) {
executed = true;
result = fn.apply(this, args);
}
return result;
};
}
// Пример использования
const initialize = runOnce(() => {
console.log('Инициализация выполнена');
return 42;
});
console.log(initialize()); // 'Инициализация выполнена', 42
console.log(initialize()); // 42 (без повторного выполнения)
console.log(initialize()); // 42

Как это работает:

  • Внутренняя переменная executed отслеживает, была ли функция вызвана.
  • При первом вызове executed становится true, результат сохраняется в result.
  • Все последующие вызовы возвращают сохранённый result, не выполняя fn повторно.
  • Использование fn.apply(this, args) сохраняет контекст this и переданные аргументы.

Этот паттерн часто применяется для однократной инициализации, подписки на события или выполнения дорогих операций.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью