The problem with var is function scope instead of block scope:
if (true) {
var leaked = "oops"
}
console.log(leaked) // "oops" - var escaped!
if (true) {
let contained = "safe"
}
console.log(contained) // Error - let stayed inside
With var, variables leak out of blocks unexpectedly. This causes subtle bugs. let keeps variables where you expect them.