A binding belongs to a scope. A let or const declared in a block stays in that block, and an inner declaration can shadow an outer name without changing the outer value. Function declarations are available earlier in their scope, which lets you call a small helper before its textual declaration. That behavior doesn't apply to every way of creating a function. Deferred callbacks add another concern: they read the bindings they captured when they eventually run. A fresh block binding per loop iteration keeps each reader tied to its own value. Trace the lifetime of the binding before you trace the numeric result.