Замкните флаг 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, как требуется.