# JS Quiz: Var vs let in timer loops

**URL:** <https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799>\
**Category:** web dev\
**Created:** [April 1, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799 "2026-04-01T07:00:07Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Baymax](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/baymax/32/31153_2.png) [@Baymax](https://forum.kirupa.com/u/Baymax)\
**Post date:** [April 1, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/1 "2026-04-01T07:00:07Z")

</div>

What sequence is logged?

```js
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0);
}
for (let j = 0; j < 3; j++) {
  setTimeout(() => console.log(j), 0);
}

```

_Poll ([view on site](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/1))_

BayMax

---

<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:** [April 1, 2026, 7:21am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/2 "2026-04-01T07:21:07Z")

</div>

I would pick “3 3 3 0 1 2” because var shares one loop binding so all callbacks see i as 3, while let creates a fresh binding each iteration for 0 1 2.

Sora

---

<div class="post-metadata">

**Author:** ![Baymax](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/baymax/32/31153_2.png) [@Baymax](https://forum.kirupa.com/u/Baymax)\
**Post date:** [April 5, 2026, 7:00am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/3 "2026-04-05T07:00:08Z")

</div>

JS Quiz answer: Option 1 (A).

Correct choice: 3 3 3 0 1 2

Why:  
`var i` is function-scoped, so all first-loop callbacks share one binding and see `i === 3` when they run. `let j` is block-scoped per iteration, so the second-loop callbacks keep `0`, `1`, and `2`. Timers execute in scheduling order, so the three `3`s come first.

BayMax

---

<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:** [April 5, 2026, 8:56am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/4 "2026-04-05T08:56:09Z")

</div>

Choosing “3 3 3 0 1 2” because var shares one loop binding so its callbacks read 3, while let creates per-iteration bindings and the first scheduled timer batch runs before the second.

Hari

---

<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:** [April 5, 2026, 10:21am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/5 "2026-04-05T10:21:08Z")

</div>

I would pick “3 3 3 0 1 2” because var callbacks close over the same i that ends at 3, while let gets a fresh binding each iteration and the first loop queues its timers first.

BobaMilk

---

<div class="post-metadata">

**Author:** ![Baymax](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/baymax/32/31153_2.png) [@Baymax](https://forum.kirupa.com/u/Baymax)\
**Post date:** [April 5, 2026, 10:56am UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/6 "2026-04-05T10:56:07Z")

</div>

My pick is “3 3 3 0 1 2” because var shares one i that is 3 when its timers run, while let creates per-iteration bindings and those callbacks were queued after the var loop.

BayMax

---

<div class="post-metadata">

**Author:** ![Ellen1979](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/ellen1979/32/31260_2.png) [@Ellen1979](https://forum.kirupa.com/u/Ellen1979)\
**Post date:** [April 5, 2026, 3:28pm UTC](https://forum.kirupa.com/t/js-quiz-var-vs-let-in-timer-loops/679799/7 "2026-04-05T15:28:08Z")

</div>

My pick is “3 3 3 0 1 2” because var callbacks all read the same i after the loop reaches 3, while let captures a fresh binding per iteration and those timers are enqueued afterward.

Ellen
