Est-ce le moyen le plus court possible d’obtenir une portée de bloc dans le corps de la for
boucle?
x = {};
for (i of ["a", "b"]) {
(function(i) {
x[i] = function() { this.v = i; }
})(i);
}
Ou y a-t-il un sucre syntaxique que je ne parviens pas à trouver?
Explication:
Avec la portée du bloc, les objets créés ont des valeurs différentes.
new x.a
⟹ x.(anonymous function) {v: "a"}
new x.b
⟹ x.(anonymous function) {v: "b"}
Sans portée de bloc
y = {};
for (i of ["a", "b"]) {
y[i] = function() { this.v = i; }
}
les objets créés auront la même valeur.
new y.a
⟹ y.(anonymous function) {v: "b"}
new y.b
⟹ y.(anonymous function) {v: "b"}
Réponses:
2 pour la réponse № 1Étant donné que vous utilisez un ES6 for of
En tout cas, vous avez déjà une portée de bloc pour votre variable d’itération - n’oubliez pas d’utiliser un let
/const
déclaration! Il n'y a pas besoin d'un IEFE.
let x = {};
for (let i of ["a", "b"])
x[i] = function() { this.v = i; };
Si vous n’utilisez pas l’ES6, je vous recommande d’utiliser l’un des Array
méthodes d'itération, comme
var x = ["a", "b"].map(function(i) {
return function() { this.v = i; };
});