Рискну предположить что имеется ввиду кэширование в контексте чистых функций.
Если функция чистая то можно гарантировать при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат: выходные данные зависят только от входных. А безопасно закешировать результат можно в том случае если аргументы имутабельны.
Например у нас есть чистая функция для расчета чисел Фибоначчи, мы можем обернуть ее функцией memoize из lodash чтобы кешировать результат:
// агрумент n является примитивом, а примитив имутабелен
let fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
console.time('first call');
console.log(fibonacci(50));
// => 12586269025
console.timeEnd('first call');
// => first call: 2.508ms
console.time('second call');
console.log(fibonacci(50));
// => 12586269025
console.timeEnd('second call');
// => second call: 0.300ms
codepen
В примере выше функция принимает примитив, а он всегда имутабелен, и проблем нет.
Теперь напишем пример где в кеширующую функцию можно подавать не имутабельные данные
let cachedFn = _.memoize((arr) => arr.length);
let arr = [1,2,3];
console.log(cachedFn(arr));
// => 3
arr.push(4);
console.log(cachedFn(arr));
// => 3 - !!!
console.log(cachedFn([...arr]));
// => 4
codepen