> Как реализовать мемоизацию функции в JavaScript (JavaScript)

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

Компании: Домклик

Стек: JavaScript

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

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

Пример универсальной функции-обёртки memoize:

JAVASCRIPT
function 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)); // Вычисление... 10
console.log(memoizedFn(5)); // 10 (из кеша)
console.log(memoizedFn(10)); // Вычисление... 20

Важные нюансы:

  • Ключ кеша должен однозначно идентифицировать набор аргументов. JSON.stringify подходит для простых типов, но не для объектов с циклическими ссылками или функциями. Для более сложных случаев можно использовать собственный сериализатор или Map с кортежами.
  • Мемоизация эффективна для чистых функций (без побочных эффектов, детерминированных).
  • Для рекурсивных функций (например, чисел Фибоначчи) мемоизация даёт огромный прирост производительности, но нужно мемоизировать именно рекурсивную версию, а не обёртку.

Пример для рекурсии:

JAVASCRIPT
const fib = memoize((n) => {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
});

В современных проектах можно использовать библиотеки вроде Lodash (_.memoize), но понимание реализации важно для собеседований и тонкой настройки.

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

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