Я понимаю, что let предотвращает дублирование деклараций, которые хороши.
let x;
let x; // error!
Переменные, объявленные с помощью let, могут также использоваться в закрытии, которые можно ожидать
let i = 100;
setTimeout(function () { console.log(i) }, i); // '100' after 100 ms
То, что я немного затрудняюсь, - это то, как let применяется к циклам. Это, по-видимому, характерно для циклов for. Рассмотрим классическую проблему:
// prints '10' 10 times
for (var i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
// prints '0' through '9'
for (let i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
Почему используется использование let в этом контексте? В моем воображении, хотя видно только один блок, for фактически создает отдельный блок для каждой итерации, а объявление let выполняется внутри этого блока... но есть только одно объявление let для инициализации значения, Это просто синтаксический сахар для ES6? Как это работает?
Я понимаю различия между var и let и проиллюстрировал их выше. Мне особенно интересно понять, почему разные объявления приводят к разным выводам с использованием цикла for.