web-dev-qa-db-ja.com

es6のcaseの後のswitchステートメントで中括弧は何をしますか?

次の違いは何ですか?

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

そして

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

最初は、そのようなオブジェクトリテラルを返すことができると思っていましたが、構文エラーであることがわかりました。実際の違いは何ですか?

別の質問の例: Javascript ES6で関数引数としてswitchステートメントを渡す方法

19
Aurimas

この方法で使用される中括弧は、独自のブロックスコープを確立します。このスコープでは、ローカルlet変数またはconst定数を定義できます。

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

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

Ecmascript 2015では、同じ識別子を持つ複数のlet/const宣言は同じスコープ内では許可されないため、ネストされたブロックスコープなしでスローされます。

switchステートメントはブロックスコープ自体を作成することに注意してください。つまり、ネストされたブロックスコープを使用するかどうか、let don '内のconst/switch宣言親スコープにリークします。

ただし、switchのコンテキストでは、個々のcaseブランチのブロックを視覚的に強調するために、中括弧も装飾的に使用されます。

49
user6445533

中括弧を使用する必要があります。

  1. moreブロックスコープ変数(const/let)を作成するとき同名
    • 仕様による MDN web docs
    • エラー:キャッチされていないSyntaxError:識別子 'variablename'はすでに宣言されています
  2. デフォルト設定でeslintを使用し、でも1つだけを使用する場合const/let
    • ルールに従って no-case-declarations
    • エラー:caseブロックno-case-declarationsの予期しない字句宣言