Track which binding a function can still reach.
Review const and mutation, block shadowing, retained closures, default parameters and two early syntax errors.
This count records matching keys on six supplied Node 24 ES module tasks. It is not a developer level, percentile, employer cutoff or qualification. Every answer and all four complete guides are available at every count.
Six checks on declarations and calls
This section separates a binding from the object value it can reach. A const declaration does not freeze an array, and a new let declaration inside a block does not assign to an outer binding of the same name. A returned function can retain access to one local counter across calls. Default parameters respond to undefined rather than every falsy argument. Two other tasks ask you to recognise a module that fails its syntax check before any code runs.
Call the same closure twice
For a new unscored example, a maker sets count to one and returns a function that adds two and returns count. Store one returned function as step, then call step twice. The values returned are three and five, so joining them with a colon prints 3:5. Calling the maker twice would create two different counters and ask a different question. Write down the number of maker calls before tracing the number of returned-function calls.
Mutation and reassignment affect different things
When labels is const, assigning a different array to labels would attempt to change the binding. Calling labels.push instead changes the existing array’s contents. Likewise, a block-local variable that shadows an outer name is a separate binding; leaving that block restores lookup of the outer one. Draw a small box for each binding and a separate shape for each array or object. This is a reasoning aid, not a physical-memory diagram or a promise about engine implementation.
Keep argument conditions explicit
The default-parameter task passes undefined explicitly, which triggers the supplied initializer. It does not pass null, zero or an empty string, and those alternatives should not be silently substituted while reading. Before evaluating the function body, write down the parameter value after initialization. Then compute the return expression. This keeps a question about defaulting separate from a question about multiplication or string conversion later in the function.
Check whether execution can begin
The duplicate let declarations share one lexical scope, and the ordinary const declaration lacks a required initializer. Those supplied programs fail before execution, rather than printing undefined or allowing the later console.log to explain the problem. Distinguish a declaration from a later assignment and an ordinary declaration from special loop syntax. The runtime verification keeps parse checking separate from executing valid snippets so that an expected syntax failure is recorded as a keyed outcome.
Predict one changed declaration before running
Use a new disposable .mjs file and change only one feature at a time: remove the second declaration and use assignment, move a declaration into a separate block, or call a returned function again. Predict whether the result is a value, a handled failure or a syntax error before running. Keep invented variable names and values. This is a suggested revision routine, without a guaranteed time to learn or a claim that visible-option recognition demonstrates independent software development.
Treat the count as a review pointer
All six items contribute equally to this section’s count. Every explanation and all four complete guides appear at zero, partial and perfect results after a valid full attempt. There is no beginner-to-expert assignment, population percentile, employer pass mark or professional qualification. Understanding one captured counter does not assess every closure, asynchronous callback or design choice. Repeating the fixed bank after reading its answers can show memory; try a fresh binding trace to explore transfer.