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

Для большего понимания мы создадим одну функцию memonize.

const mul = (a,b,c)=>a*b*c;


const memonize =(fn)=>{
const cacheData ={};
return (...args)=>{
let argsString = JSON.stringify(args)
if(cacheData[argsString]){
console.log("cache data is return")
  return cacheData[argsString]

} else {
 let result = fn.apply(this,args);
  cacheData[argsString] = result
return result;
}

}
}

const result = memonize(mul)
const resultFact = memonize((n)=>{
if(n==0){
return 1}
else{
return n* resultFact(n-1)
}}
console.log(result(1,2,3))
console.log(result(1,2,3))
console.log(result(5,6,7))
console.log(resultFact(10))
console.log(resultFact(11))

Мы запоминаем функцию умножения в вышеупомянутом фрагменте кода. Мы используем понятие замыкания внутри функции memonize, где дочерняя функция создает лексическую область видимости, используя cacheData для поддержания состояния.

Мы используем cachheData как пустой объект внутри метода memonize перед возвратом функции с переданными входными данными.

Все параметры преобразуются в строки перед проверкой на наличие значения ключа в кэшеData. Если нет, мы вызываем функцию с входящими аргументами, кэшируем результат для дальнейшего использования, а затем возвращаем результат вычисления.