Une autre utilisation a eu lieu pour moi aujourd'hui, j'ai donc cherché sur le web avec enthousiasme et a trouvé un existant mention: Définition de Variables dans un Bloc de Portée.
Arrière-plan
JavaScript, en dépit de sa ressemblance superficielle avec le C et le C++, n'a pas de portée des variables dans le bloc qu'ils sont définis dans:
var name = "Joe";
if ( true )
{
var name = "Jack";
}
// name now contains "Jack"
La déclaration d'une fermeture en boucle est une tâche commune où cela peut conduire à des erreurs:
for (var i=0; i<3; ++i)
{
var num = i;
setTimeout(function() { alert(num); }, 10);
}
Parce que la boucle for n'introduit pas un nouveau champ d'application, le même num
- avec une valeur de 2
- seront partagés par l'ensemble des trois fonctions.
Un nouveau champ d'application: let
et with
Avec l'introduction de l' let
déclaration en JavaScript 1.7, il devient facile d'introduire un nouveau champ d'application lorsque cela est nécessaire pour éviter ces problèmes:
for (var i=0; i<3; ++i)
{
// variables introduced in this statement
// are scoped to the block following it.
let (num = i)
{
setTimeout(function() { alert(num); }, 10);
}
}
Mais jusqu'à ce que les autres navigateurs en œuvre, cela restera limitée à Mozilla code ciblé. Cependant, nous pouvons facilement simuler ce comportement à l'aide de with
:
for (var i=0; i<3; ++i)
{
// object members introduced in this statement
// are scoped to the block following it.
with ({num: i})
{
setTimeout(function() { alert(num); }, 10);
}
}
La boucle fonctionne maintenant comme prévu, la création de trois variables distinctes avec des valeurs de 0 à 2. Notez que les variables déclarées dans le bloc ne sont pas limités à, ce qui est identique au comportement de l' let
, mais à la différence du comportement de blocs en C++ (en C, les variables doivent être déclarées au début d'un bloc, donc dans un sens, c'est similaire).