在es6中的case语句后,花括号在switch语句中做了什么?

Aur*_*mas 21 javascript scope switch-statement ecmascript-6

有什么区别:

switch (expression) {
    case:
      somethings;
      break;
}
Run Code Online (Sandbox Code Playgroud)

switch (expression) {
    case: {
      somethings;
      break;
    }
}
Run Code Online (Sandbox Code Playgroud)

起初我以为我可以像这样返回一个对象文字,但事实证明这是一个语法错误.实际上有什么区别?

另一个问题的例子: 如何在Javascript ES6中将switch语句作为函数参数传递?

小智 51

以这种方式使用的大括号建立自己的块作用域,您可以在其中定义局部let变量或const常量:

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

    case false: {
      let x = "baz";
      console.log(x);
      break;
    }
}
Run Code Online (Sandbox Code Playgroud)

该示例将抛出没有嵌套块作用域,因为在Ecmascript 2015中,不允许在同一作用域内使用具有相同标识符的多个let/ const声明.

请注意,该switch语句本身会创建一个块作用域,即是否使用嵌套块作用域,内部的let/ const声明switch不会泄漏到父作用域中.

然而,在上下文中switch,花括号也使用纯装饰,以视觉突出各个case分支的块.

  • _"哪种语法更简单是基于意见的"_这不是重点.取'a**b`而不是'Math.pow(a,b)`.两者都意味着相同,但一个更短/更简洁.这是语法糖.但是`case 1:let x = 2`和`case 1:{let x = 2}的结果完全不同.它不仅仅是不同的语法,它**是不同的.苹果不是橙子的语法糖. (9认同)
  • _“他们在视觉上突出了每个案例的块”_ 那将是装饰,而不是语法糖。_“在大多数情况下这并不是真正必要的”_ 描述什么时候**是**必要的会更有用。 (2认同)

Mic*_*ský 8

你必须使用大括号:

  1. 创建更多同名的块作用域变量 ( const/ let)时
  2. 在默认设置下使用eslint并使用单个( const/ let) 时