dejar la palabra clave en el bucle for

ECMAScript 6'slet Se supone que debe proporcionar el alcance del bloque sin levantar dolores de cabeza. ¿Alguien puede explicar por qué en el código de abajo?i en la función se resuelve el último valor del bucle (al igual que convar) en lugar del valor de la iteración actual?

"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

De acuerdo aMDN utilizandolet en elfor Un bucle así debería vincular la variable en el alcance del cuerpo del bucle. Las cosas funcionan como las esperaba cuando utilizo una variable temporal dentro del bloque. ¿Por qué es necesario?

"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

Probé el guión con Traceur ynode --harmony.

Respuestas a la pregunta(3)

Su respuesta a la pregunta