How do closures capture values from previous calls?
Obviously, Line A isn't being called each time counter1
is called.
The sequence of events is:
makeCounter
is called, which declares and initializesn
(Line A), definesadder
, and returnsadder
in a context that includesn
already having been defined and initialized to 1.It is this function that was just returned that is assigned to
counter1
. Because the Line A is not part of that function (adder
/counter1
), it does not get executed when that function is called.Each call to
counter1
is executed in that same context, which is whyn
retains its value across calls: they are all accessing the samen
.