deixe a palavra-chave no loop for

ECMAScript 6'slet é suposto fornecer escopo de bloco sem içar dores de cabeça. Alguns podem explicar porque no código abaixoi na função resolve para o último valor do loop (assim como comvar) em vez do valor da iteração atual?

"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 acordo comMDN usandolet nofor loop como esse deve ligar a variável no escopo do corpo do loop. As coisas funcionam como eu esperava quando eu uso uma variável temporária dentro do bloco. Por que isso é necessário?

"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

Eu testei o script com Traceur enode --harmony.

questionAnswers(3)

yourAnswerToTheQuestion