web-dev-qa-db-fra.com

Que font les accolades dans les instructions switch après case dans es6?

Quelle est la différence entre:

switch (expression) {
    case:
      somethings;
      break;
}

et

switch (expression) {
    case: {
      somethings;
      break;
    }
}

Au début, je pensais pouvoir renvoyer un objet littéral comme ceci, mais il s'avère que c'est une erreur de syntaxe. Quelle est la différence en réalité?

Exemple tiré d'une autre question: Comment passer l'instruction switch en tant qu'argument de fonction dans Javascript ES6?

12
Aurimas

Les accolades utilisées de cette manière établissent leur propre portée de bloc, dans laquelle vous pouvez définir des variables let ou des constantes const locales:

switch (false) {
    case true: {
      let x = "bar";
      console.log(x);
      break;
    }

    case false: {
      let x = "baz";
      console.log(x);
      break;
    }
}

L'exemple jetterait sans portées de bloc imbriquées, car plusieurs déclarations let/const portant le même identifiant ne sont pas autorisées dans la même portée dans Ecmascript 2015.

Veuillez noter que l’instruction switch crée une portée de bloc elle-même, c’est-à-dire que vous utilisiez des portées de bloc imbriquées ou non, les déclarations let/const à l'intérieur de switch ne fuient pas dans la portée parent.

Toutefois, dans le contexte de switch, les accolades sont également utilisées à des fins purement décoratives, afin de mettre en évidence visuellement les blocs de chaque branche case.

36
user6445533

vous devez utiliser des accolades:

  1. lors de la création de more variables couvertes par un bloc (constlet) avec _/même nom
    • selon spécification Web docs MDN
    • ERREUR: Uncaught SyntaxError: l'identifiant 'nom_variable' a déjà été déclaré
  2. lorsque vous utilisez eslint dans les paramètres par défaut et même un seul (const/let)
    • selon la règle no-case-declarations
    • ERREUR: déclaration lexicale inattendue dans case block no-case-declarations
0