Search code examples
javascriptscopeecmascript-6constantslet

Why does const work in some for-loops in JavaScript?


I do know why const doesn't work in for-loops. We need to create a new scope and copy over a value into that. So this won't fly.

for(const i = 0; i < 5; i++) console.log(i);

Whereas this will.

for(let i = 0; i < 5; i++) console.log(i);

However, I noticed that both of them work when looping though the properties of an object like this.

for(let property in thingy) console.log(property);
for(const property in thingy) console.log(property);

I'm not sure why.


Solution

  • for (const property in object) works because with each iteration you get a new variable, which is scoped only to that iteration. You can easily check that by using a closure inside a loop:

    for (const property in {a: 1, b: 2}) {
      setTimeout(() => {
        console.log(property);
      }, 100);
    }

    This logs a and b, but if you change const to var, it logs b twice.