ECMAScript 6's let
is supposed to provide block scope without hoisting headaches. Can some explain why in the code below i
in the function resolves to the last value from the loop (just like with var
) instead of the value from the current iteration?
use strict;
var things = {};
for (let i = 0; i < 3; i++) {
things[fun + i] = function() {
console.log(i);
};
}
things[fun0](); // prints 3
things[fun1](); // prints 3
things[fun2](); // prints 3
According to MDN using let
in the for
loop like that should bind the variable in the scope of the loop's body. Things work as I'd expect them when I use a temporary variable inside the block. Why is that necessary?
use strict;
var things = {};
for (let i = 0; i < 3; i++) {
let index = i;
things[fun + i] = function() {
console.log(index);
};
}
things[fun0](); // prints 0
things[fun1](); // prints 1
things[fun2](); // prints 2
I tested the script with Traceur and node --harmony
.