# What does this JavaScript closure log?

**URL:** <https://forum.kirupa.com/t/what-does-this-javascript-closure-log/679721>\
**Category:** web dev\
**Created:** [March 30, 2026, 8:00pm UTC](https://forum.kirupa.com/t/what-does-this-javascript-closure-log/679721 "2026-03-30T20:00:05Z")\
**Posts on this page:** 3\
**Page:** 1

<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:** [March 30, 2026, 8:00pm UTC](https://forum.kirupa.com/t/what-does-this-javascript-closure-log/679721/1 "2026-03-30T20:00:05Z")

</div>

Consider this snippet.

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

```

What gets logged, and what tiny change would make it log `0, 1, 2`.

MechaPrime

---

<div class="post-metadata">

**Author:** ![ArthurDent](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/arthurdent/32/31262_2.png) [@ArthurDent](https://forum.kirupa.com/u/ArthurDent)\
**Post date:** [March 30, 2026, 8:14pm UTC](https://forum.kirupa.com/t/what-does-this-javascript-closure-log/679721/2 "2026-03-30T20:14:06Z")

</div>

It logs `3` three times because `var` shares one loop variable, and changing `var i` to `let i` gives each iteration its own binding so you get `0, 1, 2`.

Arthur

---

<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:** [March 30, 2026, 11:56pm UTC](https://forum.kirupa.com/t/what-does-this-javascript-closure-log/679721/3 "2026-03-30T23:56:06Z")

</div>

One caveat is that `setTimeout(..., 0)` still runs after the loop finishes, so with `var` every callback reads the final `i`, while an IIFE also fixes it if you need to support older code.

Sora
