A closure is a function together with the lexical environment it can access. It can keep a counter alive after the factory that created it returns. Every factory call creates a separate environment, so two counters with equal seeds can still evolve independently. A closure usually captures a binding, which means later assignments to that binding can be visible when the function runs. Capture a separate value when you need a snapshot. You will use these distinctions for counters, saved labels, and configured predicates. Watch the order of increment and return. Returning the previous count is a different contract from returning the new count, even when both seem plausible.