> Как реализовать мемоизацию функции в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Домклик
Стек: JavaScript
> Пример ответа
Мемоизация - это техника оптимизации, при которой результаты вызовов функции кешируются, чтобы при повторном вызове с теми же аргументами не выполнять вычисления заново. В JavaScript её можно реализовать с помощью замыкания и объекта (или Map) для хранения кеша.
Пример универсальной функции-обёртки memoize:
JAVASCRIPTfunction memoize(fn) {const cache = new Map();return function(...args) {const key = JSON.stringify(args);if (cache.has(key)) {return cache.get(key);}const result = fn.apply(this, args);cache.set(key, result);return result;};}// Использование:const expensiveFunction = (n) => {console.log('Вычисление...');return n * 2;};const memoizedFn = memoize(expensiveFunction);console.log(memoizedFn(5)); // Вычисление... 10console.log(memoizedFn(5)); // 10 (из кеша)console.log(memoizedFn(10)); // Вычисление... 20
Важные нюансы:
- Ключ кеша должен однозначно идентифицировать набор аргументов.
JSON.stringifyподходит для простых типов, но не для объектов с циклическими ссылками или функциями. Для более сложных случаев можно использовать собственный сериализатор или Map с кортежами. - Мемоизация эффективна для чистых функций (без побочных эффектов, детерминированных).
- Для рекурсивных функций (например, чисел Фибоначчи) мемоизация даёт огромный прирост производительности, но нужно мемоизировать именно рекурсивную версию, а не обёртку.
Пример для рекурсии:
JAVASCRIPTconst fib = memoize((n) => {if (n <= 1) return n;return fib(n - 1) + fib(n - 2);});
В современных проектах можно использовать библиотеки вроде Lodash (_.memoize), но понимание реализации важно для собеседований и тонкой настройки.
> Похожие задачи по frontend
Как обрабатывать дублирующиеся ключи при преобразовании массива объектов в объект в JavaScript
Как реализовать функцию retry для повторного вызова асинхронной функции при ошибке в JavaScript
Реализовать функцию, принимающую массив промисов и возвращающую массив результатов или первый reject в JavaScript
Как решать задачу анимации шаг за шагом
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью