const已在ES6开关块中声明

时间:2015-10-28 17:33:41

标签: javascript node.js const ecmascript-6

考虑文件sample.es6

switch (1) {
    case 1:
        const foo = 1;
        break;
    case 2:
        const foo = 2;
        break;
}

如果我使用Node运行它

$ node --version
v4.2.11
$ node sample.es6 
/tmp/sample.es6:6
const foo = 2;
^

SyntaxError: Identifier 'foo' has already been declared
    at Object.<anonymous> (/tmp/sample.es6:1:11)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:134:18)
    at node.js:961:3

为什么我收到此错误?节点不应评估const foo = 2;

5 个答案:

答案 0 :(得分:13)

您正在获得SyntaxError因为您正在同一范围内重新声明变量;一个switch语句contains only one underlying block,而不是每case个一个块。

JavaScript在编译时时抛出错误。 “节点不应该评估const foo = 2;”是无关紧要的,因为在Node评估任何内容之前会发生此错误。

const(以及许多新的ES6功能,例如新模块规范)的一个目的是使编译器能够进行一些静态分析。 const告诉编译器永远不会重新分配变量,这样引擎就可以更有效地处理变量。

当然,这需要进行编译时检查以确保变量确实从未被重新分配(或重新声明),这就是您看到错误的原因。

答案 1 :(得分:5)

您可以使用立即调用函数表达式(IIFE)进行常量赋值:

const foo=(function(){
  switch (1) {
    case 1:
      return 1;
      break;
    case 2:
      return 2;
      break;
  }
})();

console.log('foo = '+foo); /* foo = 1 */

另外,你可以用大括号在case中创建一个范围,但你不能访问开关区外的foo:

switch (1) {
  case 1: {
    const foo = 1;
    console.log(foo+' from inside'); /* 1 from inside */
  } break;
  case 2: {
    const foo = 2;
    console.log(foo+' from inside');
  } break;
}

console.log(foo+' from outside'); /* foo is not defined */

答案 2 :(得分:3)

您可以围绕您的案例创建范围块,并且eslint会很高兴:

switch (1) {
    case 1: {
        // notice these extra curly braces
        const foo = 1;
        break;
    }
    case 2: {
        const foo = 2;
        break;
    {
}

答案 3 :(得分:0)

使用临时变量确定值,然后在确定值后设置常量。

let bar;
switch (1) {
    case 1:
        bar = 1;
        break;
    case 2:
        bar = 2;
        break;
}
const foo = bar;

答案 4 :(得分:0)

如果您希望在 case 语句中创建范围,则应使用(IIFE) 立即调用函数表达式。它允许您在 case 语句中创建所需的其他范围。

function (value) {
   switch (value) {
     case 1:
       return (function() {
         const foo = 1
         return foo
       }())
       break;
     case 2:
       return (function() {
         const foo = 2
         return foo
       }())
       break;
   }
}

以下是https://jsfiddle.net/hermanleus/e4ceq7xt/2/

的示例

希望有所帮助