Root cause of captured values and the right remedies.
01
01
Understand the problem
reacthooksclosures
02
02
Attempt it yourself
Sketch your approach before reading the solution — that's what interviews test.
Stuck? AI Nudge Available
Get a conceptual hint to guide your logic without spoiling the final implementation.
03
03
Study the solution
The solution is waiting
Give it an honest attempt first — then compare your thinking with the full walkthrough.
04
04
Explore the playground snippets
Stale closure vs. functional update
Run Playgroundimport { useState, useEffect } from 'react';
export default function App() {
const [correct, setCorrect] = useState(0);
const [buggy, setBuggy] = useState(0);
useEffect(() => {
const id = setInterval(() => {
setBuggy(buggy + 1); // STALE: captures buggy=0 forever -> sticks at 1
setCorrect((c) => c + 1); // CORRECT: functional update reads latest
}, 1000);
return () => clearInterval(id);
}, []); // empty deps on purpose, to expose the stale closure
return (
<div style={{ fontFamily: 'sans-serif', padding: 24 }}>
<p>Functional update (climbs): <b>{correct}</b></p>
<p>Stale closure (stuck at 1): <b>{buggy}</b></p>
</div>
);
}05
05
Join the discussion
Discussion (0)
Sign in to join the discussion.
No responses yet. Be the first to share what you think.