---
title: Cache Repeated Function Calls
impact: MEDIUM
impactDescription: avoid redundant computation
tags: javascript, cache, memoization, performance
---
## Cache Repeated Function Calls
Use a module-level Map to cache function results when the same function is called repeatedly with the same inputs during render.
**Incorrect (redundant computation):**
```tsx
function ProjectList({ projects }: { projects: Project[] }) {
return (
{projects.map((project) => {
// slugify() called 100+ times for same project names
const slug = slugify(project.name);
return
;
})}
);
}
```
**Correct (cached results):**
```tsx
// Module-level cache
const slugifyCache = new Map();
function cachedSlugify(text: string): string {
if (slugifyCache.has(text)) {
return slugifyCache.get(text)!;
}
const result = slugify(text);
slugifyCache.set(text, result);
return result;
}
function ProjectList({ projects }: { projects: Project[] }) {
return (
{projects.map((project) => {
// Computed only once per unique project name
const slug = cachedSlugify(project.name);
return
;
})}
);
}
```
**Simpler pattern for single-value functions:**
```typescript
let isLoggedInCache: boolean | null = null;
function isLoggedIn(): boolean {
if (isLoggedInCache !== null) {
return isLoggedInCache;
}
isLoggedInCache = document.cookie.includes("auth=");
return isLoggedInCache;
}
// Clear cache when auth changes
function onAuthChange() {
isLoggedInCache = null;
}
```
Use a Map (not a hook) so it works everywhere: utilities, event handlers, not just React components.
Reference: [How we made the Vercel Dashboard twice as fast](https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast)