Как сделать функцию, которая при вызове возвращает следующий код в JavaScript
Что проверяют
Умеете ли вы хранить состояние между вызовами без глобальных переменных, то есть понимаете ли замыкания. После базового счётчика обычно просят коды заданного формата и несколько независимых генераторов.
Как отвечать
Сначала уточните условие: «следующий код» чаще всего означает, что каждый вызов возвращает очередное значение последовательности, A001, A002 и так далее. Понимать задачу как «вернуть строку с исходником» не стоит, eval и new Function здесь не нужны.
Базовое решение через замыкание:
function createCodeGen(prefix = "A", start = 1) {
let n = start;
return () => prefix + String(n++).padStart(3, "0");
}
const next = createCodeGen();
next(); // "A001"Что стоит проговорить:
- замыкание: переменная
nживёт в области видимости фабрики и недоступна снаружи, а каждый вызовcreateCodeGenдаёт независимый счётчик; - генератор:
function*сyieldв бесконечном цикле, значение берут черезgen.next().value. Удобно, когда правило последовательности сложное; - переполнение:
padStartдобивает нулями, но что идёт послеA999, нужно решить заранее: расширять разрядность, переходить наB001или бросать ошибку; - буквенные коды:
AA,AB…AZ,BAстроятся как счёт в системе с основанием 26, через деление с остатком иString.fromCharCode(65 + d); - сброс: при необходимости фабрика возвращает объект
{ next, reset }.
Отдельно скажите, что такой счётчик живёт только в памяти вкладки и обнуляется при перезагрузке. Для кодов, уникальных между сессиями и пользователями, нужен сервер или crypto.randomUUID().
Где спотыкаются
Держат счётчик в глобальной переменной. Любой код может его испортить, а второй независимый генератор уже не сделать.
Путают n++ и ++n и начинают последовательность не с того числа. Проговорите граничные значения вслух.
Не спрашивают про формат и переполнение, пишут решение под три цифры и молча выдают A1000, ломая ожидаемую длину кода.