Давайте разберем сначала
var:
var a = 1;
(function() {
var a = 2;
console.log(a); // 2
})();
console.log(a); // 1
var a = 1;
do {
var a = 2;
console.log(a); // 2
} while(false);
console.log(a); // 2
Что происходит:
1.
var a = 1;
объявляет a видимым для себя и дочерних блоков. a будет = 1 если внутри будет for или function.
И снаружи, но только если не в function. Например var a = 2
исполнилось, но пропало, так как вызвано в функции (лямбде).
2.
var a = 2
(который в do...while) переобъявляет первый a = 1, так как do..while - не function.
Теперь
let:
let a = 1;
(function() {
let a = 2;
console.log(a); // 2
})();
console.log(a); // 1
let a = 1;
do {
let a = 2;
console.log(a); // 2
} while(false);
console.log(a); // 1
Что происходит:
1. Здесь как в
var
2.
let a = 2
(который в do...while) объявляет a в своей области видимости, первый a = 1 остается.