Just execute this code in your browser and find the ten differences between the two loops:
- 
<html>
 - 
<body>
 - 
<script type="application/javascript;version=1.7">
 - 
 - 
let funs = {};
 - 
let msg = "";
 - 
 - 
for (let i = 0; i < 10; i++) {
 - 
funs[i] = function() {
 - 
msg += "i = " + i + "n";
 - 
}
 - 
}
 - 
 - 
for (let i = 0; i < 10; i++) funs[i]();
 - 
 - 
alert("Without redeclaration: n"+msg);
 - 
 - 
msg = "";
 - 
for (let i = 0; i < 10; i++) {
 - 
let idx = i;
 - 
funs[i] = function() {
 - 
msg += "i = " + idx + "n";
 - 
}
 - 
}
 - 
 - 
for (let i = 0; i < 10; i++) funs[i]();
 - 
 - 
alert("With redeclaration: n"+msg);
 - 
 - 
</script>
 - 
</body>
 - 
</html>
 
As you can see, the i variable works as if it was declared outside the loop, so it’s reused inside it. Thus, if you use it inside a closure, all the closures share the same reference and can see the changes produced during the iterations.
However, in the second loop a new fresh local variable is defined for each iterations, so the values aren’t shared among the closures.