> Как реализовать функцию memo для кеширования результатов вызовов по аргументам в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: 1221 Systems
Стек: JavaScript
> Пример ответа
Для реализации функции memo (мемоизации) в JavaScript можно использовать замыкание и объект (или Map) для хранения кеша. Вот пример:
JAVASCRIPTfunction memo(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 = (a, b) => {console.log('Вычисление...');return a + b;};const memoizedFn = memo(expensiveFunction);console.log(memoizedFn(1, 2)); // Вычисление... 3console.log(memoizedFn(1, 2)); // 3 (из кеша)
Ключевые моменты:
- Используем
Mapдля кеша - он эффективнее объекта для частых операций. JSON.stringifyсоздаёт ключ на основе аргументов, но не подходит для объектов с циклическими ссылками или функциями.- Для простых типов (числа, строки) можно использовать сам аргумент как ключ.
- Важно учитывать контекст
thisчерезapply.
Улучшенная версия с поддержкой сложных аргументов:
JAVASCRIPTfunction memo(fn, resolver) {const cache = new Map();return function(...args) {const key = resolver ? resolver(...args) : args[0];if (cache.has(key)) return cache.get(key);const result = fn.apply(this, args);cache.set(key, result);return result;};}
Такой подход позволяет гибко настраивать генерацию ключа через опциональный resolver.
> Похожие задачи по frontend
Как парсится и обрабатывается JavaScript в браузере
В чем разница между document.getElementsByClassName и querySelectorAll в JavaScript
Как избежать конкатенации чисел как строк в функции суммы аргументов в JavaScript?
Как реализовать бесконечный скролл
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью