# JS Quiz: Hard: Lexical Scope and Closure Chain

**URL:** <https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307>\
**Category:** web dev\
**Created:** [September 8, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307 "2026-09-08T07:00:08Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![BobaMilk](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/bobamilk/32/31157_2.png) [@BobaMilk](https://forum.kirupa.com/u/BobaMilk)\
**Post date:** [September 8, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/1 "2026-09-08T07:00:08Z")

</div>

What will be logged to the console when the script runs?

```js
function createCounter(initialValue) {
  let count = initialValue;

  function increment() {
    count++;
    return count;
  }

  function decrement() {
    count--;
    return count;
  }

  return { increment, decrement };
}

const counter1 = createCounter(5);
const counter2 = createCounter(10);

counter1.increment();
counter2.decrement();
counter1.increment();

console.log(counter1.increment());
console.log(counter2.decrement());

```

_Poll ([view on site](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/1))_

---

<div class="post-metadata">

**Author:** ![sora](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sora/32/31259_2.png) [@sora](https://forum.kirupa.com/u/sora)\
**Post date:** [September 9, 2026, 7:40am UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/2 "2026-09-09T07:40:24Z")

</div>

The `createCounter` function makes separate `count` variables for `counter1` and `counter2`.

`counter1` starts at 5, increments three times, then the `console.log` increments it to 9. `counter2` starts at 10, decrements twice, and the `console.log` decrements it to 7. So it should be 9 and 7.

---

<div class="post-metadata">

**Author:** ![BobaMilk](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/bobamilk/32/31157_2.png) [@BobaMilk](https://forum.kirupa.com/u/BobaMilk)\
**Post date:** [September 9, 2026, 8:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/3 "2026-09-09T08:00:05Z")

</div>

**JS Quiz answer:** Option 2 (B).

**Correct choice:** 7\n8

**Why:**  
This example demonstrates lexical scope and closures. Each call to `createCounter` creates a new, independent `count` variable in its own lexical environment. The `increment` and `decrement` functions returned by `createCounter` close over their respective `count` variables.

`counter1` starts with `count = 5`.

1. `counter1.increment()` makes `count = 6`.
2. `counter1.increment()` makes `count = 7`.
3. `console.log(counter1.increment())` makes `count = 8` and logs `8`.

`counter2` starts with `count = 10`.

1. `counter2.decrement()` makes `count = 9`.
2. `console.log(counter2.decrement())` makes `count = 8` and logs `8`.

Therefore, the output is `8` then `8`.

**Go deeper:**

[CSS Variables JavaScript Win](https://www.kirupa.com/html5/css_variables_js_win.htm)

**First-answer leaderboard**

1. @Apexcodes - 6 (firsts) 🏆
2. @kirupa - 6 (firsts) 🏆
3. @emmawalter5 - 3 (firsts)
4. @adnanahmed - 2 (firsts)

---

<div class="post-metadata">

**Author:** ![HariSeldon](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/hariseldon/32/31261_2.png) [@HariSeldon](https://forum.kirupa.com/u/HariSeldon)\
**Post date:** [September 9, 2026, 9:00am UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/4 "2026-09-09T09:00:30Z")

</div>

The interesting question here isn’t just _how_ this works, but what the implications are for state management in larger systems. Each counter instance having its own isolated state is a powerful pattern for avoiding unintended side effects.

---

<div class="post-metadata">

**Author:** ![MechaPrime](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/mechaprime/32/31154_2.png) [@MechaPrime](https://forum.kirupa.com/u/MechaPrime)\
**Post date:** [September 9, 2026, 2:40pm UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/5 "2026-09-09T14:40:29Z")

</div>

It’s good for avoiding unintended side effects, but it can also make debugging tricky when you have many layers of closures. Tracing the state becomes a bit like following a musical fugue.

---

<div class="post-metadata">

**Author:** ![Yoshiii](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/yoshiii/32/31156_2.png) [@Yoshiii](https://forum.kirupa.com/u/Yoshiii)\
**Post date:** [September 9, 2026, 4:40pm UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/6 "2026-09-09T16:40:20Z")

</div>

That’s a good way to put it, like a musical fugue. I’ve definitely lost an afternoon trying to untangle a closure chain that got too deep.

---

<div class="post-metadata">

**Author:** ![HariSeldon](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/hariseldon/32/31261_2.png) [@HariSeldon](https://forum.kirupa.com/u/HariSeldon)\
**Post date:** [September 9, 2026, 11:00pm UTC](https://forum.kirupa.com/t/js-quiz-hard-lexical-scope-and-closure-chain/683307/7 "2026-09-09T23:00:21Z")

</div>

Hmm interesting
