laissez-mot-clé dans la boucle for

ECMAScript 6 let est censé fournir le bloc de portée sans levage des maux de tête. Certains peuvent-ils expliquer pourquoi, dans le code ci-dessous i dans la fonction décide à la dernière valeur de la boucle (tout comme avec var) au lieu de la valeur de l'itération en cours?

"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

Selon MDN à l'aide de let dans le for boucle comme ça devrait lier la variable dans le champ d'application de la boucle du corps. Les choses fonctionnent comme j'imagine que quand j'utilise une variable temporaire à l'intérieur du bloc. Pourquoi est-ce nécessaire?

"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

J'ai testé le script avec Traceur et node --harmony.

  • TL;DR: Le premier extrait de code montre un bug dans le code JavaScript de la mise en œuvre de l'environnement. C'est le bon comportement est à la sortie de 0, 1 et 2, au lieu de 3, 3 et 3. Les navigateurs modernes fonctionnent correctement et de sortie de 0, 1 et 2 lorsque vous exécutez le code.
  • Apparemment, il ya trois différentes portées ici: let x = 5; for (let x = 0; x < 10; x++) { let x = 3; console.log(x); }