web-dev-qa-db-ja.com

JavaScriptの一部のforループでconstが機能するのはなぜですか?

I 知っているなぜconstがforループで機能しないのか。新しいスコープを作成し、それに値をコピーする必要があります。だからこれは飛ばないでしょう。

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

これはそうなるのに対して。

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

ただし、このようなオブジェクトのプロパティをループすると、両方が機能することに気付きました。

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

理由はわかりません。

15

for (const property in object)が機能するのは、反復ごとに、その反復のみにスコープされる新しい変数を取得するためです。ループ内のクロージャを使用すると、簡単に確認できます。

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

これはabをログに記録しますが、constvarに変更すると、bを2回ログに記録します。

19

最初の例では、ii++を介して変更されます。 constは変更できないため、エラーが発生します。

2番目の例では、propertyループの反復ごとにforが再定義されます(各インスタンスはスコープ外になり、同じ変数に再割り当てするのではなく、新しいインスタンスが作成されます) 。値を変更するのではなく実際に再定義しているので、constは問題なく機能します。

16
Justin Niessner