ES6 переменная области видимости блока javascript, поднимающаяся для заголовка
Подняты ли все переменные области видимости в блоке цикла for над самим заголовком цикла?
var x = 4;
for(let i = 3; i < x; i++) {
let x = 2;
...
}
Должно ли это приводить к ошибке мертвой зоны на x каждый раз, когда i сравнивается с x в заголовке цикла? Я понимаю, что меня опускают в область видимости блока, но почему не х?
4 ответа
Соответствующий раздел спецификации языка - 13.7.4.
Если for
заявление содержит let
или же const
объявление, то создается область.
Каждая итерация создает область, если for
заявление содержит let
декларация.
Если тело for является блоком, то создается область.
Вот несколько примеров и областей, которые создаются:
//no scope
for(i = 0; i<3; i++) console.log(i);
//no scope
for(var i = 0; i<3; i++) console.log(i);
//for scope and iteration scope
for(let i = 0; i<3; i++) console.log(i);
// for scope, iteration scope and block scope
for(let i = 0; i<3; i++) {
console.log(i);
}
Зачем нам нужны области итераций? Для закрытий:
for(let i = 0; i<3; i++) {
setTimeout(() => console.log(i), 10);
}
Выход без итерационной области: 3,3,3. С объемом итераций: 0,1,2
Подняты ли все переменные области видимости в блоке цикла for над самим заголовком цикла?
Нет, они подняты в прицеле блока
Должно ли это приводить к ошибке мертвой зоны на x каждый раз, когда i сравнивается с x в заголовке цикла? Я понимаю, что меня опускают в область видимости блока, но почему не х?
Нет потому что x
в заголовке цикла ссылается x
определяется как 4 var x = 4
Вы не можете получить доступ к let
переменная до того, как она была объявлена, так как это время между областью видимости и декларацией является TDZ.
ех.
console.log(x) // Reference Error, x is in TDZ
let x = 4
console.log(x) // --> 4
Я неправильно понял, и подумал, что будет только одна область блока. Я отказался от принятия двух произвольных переменных в выражении i < x
и нужно решить, в каком блоке искать их, что невозможно определить.
Правильный подход заключается в создании двух вложенных областей блока, один для заголовка цикла и один для тела цикла. Это означает let i
видно как в заголовке цикла, так и в области видимости тела цикла, и let x
в цикле видно только в области видимости тела цикла. Легкая гороховая, лимонная выжимка.