Итак, я заметил, что должен использовать let
внутри цикла for
и не могу использовать const
. Однако я обнаружил, что могу использовать const
внутри конструкций for-in
и for-of
(код ниже). Интуитивно я могу объяснить, что это связано с тем, что цикл for
реализован по-другому/более примитивен, тогда как другие конструкции превращаются в циклы for, где итерирующая переменная назначается в верхней части цикла for.
// Doesn't work
for (const i = 0; i < 3; i++) {
console.log(i);
}
// Works
for (let i = 0; i < 3; i++) {
console.log(i);
}
// Works
const object2 = ['a', 'b', 'c'];
for (const v of object2) {
console.log(v);
}
// Works
const object3 = {
a: 'a',
b: 'b',
c: 'c',
};
for (const v in object3) {
console.log(v);
}
Единственное, что я смог найти в Mozilla MDN по этому поводу, было на для страницы цикла:
Это выражение может опционально объявлять новые переменные с помощью ключевого слова var. Эти переменные не являются локальными для цикла, т. е. они находятся в той же области видимости, что и цикл for. Результат этого выражения отбрасывается.
Что также кажется неправильным, потому что если мы используем let
для i
, то i
больше не будет в области видимости после цикла for
(что согласуется с другими языками).
for (let i = 0; i < 3; i++) {
console.log(i);
}
// Doesn't work as expected
console.log(i);
Мой вопрос в том, ожидается ли такое поведение и определено ли оно где-то в спецификации? MDN мало что говорит об этом.