切换案例的Javascript范围变量?

Phi*_*ide 9 javascript scope switch-statement

在C中,您可以将变量范围限定为开关案例,如下所示.

使用javascript,我使用以下方法得到意外的令牌:

const i = 1

switch (i) {
    // variables scoped to switch
    var s
    var x = 2342
    case 0:
      s = 1 + x
      break
    case 1:
      s = 'b'
      break
}
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点,还是我应该在交换机外声明我的变量?

编辑:

这是我考虑过的一种解决方法,但它并没有最终起作用.原因是每个案例都有自己的范围.

const i = 1

switch (i) {
    case i:
      // variables scoped to switch
      var s
      var x = 2342
    case 0:
      s = 1 + x
      break
    case 1:
      s = 'b'
      break
}
Run Code Online (Sandbox Code Playgroud)

Fat*_*lla 43

一些替代品:

/* curly braces inside the case */

const i = 1

switch (i) {
  case 0: {
    let x = 2342;
    let s = 1 + x;
    console.log(x+' & '+s+' from inside');
  } break;
  case 1: {
    let x = 2342;
    let s = 'b';
    console.log(x+' & '+s+' from inside'); /* 2342 & b from inside */
  } break;
}

console.log(x+' & '+s+' from outside'); /* Uncaught ReferenceError */
Run Code Online (Sandbox Code Playgroud)

要么

/* curly braces outside the switch */

const i = 1

{
  let x = 2342;
  let s;
  switch (i) {
    case 0:
      s = 1 + x;
      break;
    case 1:
      s = 'b';
      break;
  }
  console.log(x+' & '+s+' from inside'); /* 2342 & b from inside */
}

console.log(x+' & '+s+' from outside'); /* Uncaught ReferenceError */
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是 TC39 委员会明显的失误。 (4认同)

dec*_*eze 5

Since var creates variables at function scope anyway, using it is pretty pointless. For this to work at a granularity below function scopes you'll have to use let and a browser/compiler which supports it, and then introduce a new block which you can scope things to (within switch it's simply invalid syntax):

if (true) {
    let s;

    switch (i) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

This scopes s to the if block, which for all intents and purposes is identical to the "switch scope" here.

If you cannot support let, you'll need to use an IIFE:

(function () {
    var s;

    switch (...) ...
})();
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试过了。这是完全合法的。就像您if的分支不会混淆一个对象文字一样,整个块也不会被混淆。 (4认同)
  • 第一个示例根本不需要`if`。只需将代码包装在“ {}”中即可。 (3认同)