A function that "remembers" its outer scope even after the outer function has returned
makeCounter() creates a new scope with its own count.
The returned function closes over that specific scope. counter1 and counter2 have completely independent memory.