Start here. This is the direct spoken answer to practice first.
Why this question matters
A lambda can outlive the method that created it, so captured local state needs somewhere to live. That affects both the values later observed and the objects retained by the callback.
A closure is a delegate whose code uses variables from an enclosing scope. The compiler moves captured variables into storage that remains reachable for as long as the delegate needs it. Lambdas capture variables, not frozen copies of their current values, so several lambdas can observe the same variable after it changes. If I need each callback to preserve a separate value, I create a new local for that iteration or pass the value explicitly into a helper.