在Switch Case语句中出现重复的Const声明错误

asa*_*nas 63 javascript ecmascript-6

我有以下代码,我收到错误'Duplicate Declaration query_url'.

  switch(condition) {
    case 'complex':
      const query_url = `something`;
      break;
    default:
      const query_url = `something`;
      break;
  }
Run Code Online (Sandbox Code Playgroud)

我知道query_url被声明了两次,这是不对的.但我不知道如何解决这个问题.有人可以帮助确定这项工作的正确方法吗?

Ber*_*rgi 278

尝试用块包装案例:

switch(condition) {
  case 'complex': {
    const query_url = `something`;
    … // do something
    break;
  }
  default: {
    const query_url = `something`;
    … // do something else
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 介意.我认为`case`是块.谢谢你的提示! (6认同)
  • 不确定为什么这是downvoted,它解决了错误? (4认同)
  • 谢谢 !这是真正的解决方案.因为,在这个简单的情况下,显然你可以定义一个全局变量,但在更复杂的情况下,全局变量在大多数switch分支中都是无意义的. (3认同)
  • 嗯,“query_url”不会被限制在定义它的块中,这违背了分配给它的整个目的吗? (2认同)
  • @torazaburo:是的,只能在那个街区使用.我不确定代码的实际用途是什么,你不应该只使用`switch`来选择单个值 - 对象(或`Map`)查找更适合该任务. (2认同)

rob*_*b2d 11

在这些情况下,我个人更喜欢(并且倾向于滥用)以下内容:

const query_url = (()=>
{
     switch(condition)
           case 'complex': return 'something';
           default       : return 'something-else';
})();
Run Code Online (Sandbox Code Playgroud)

(这需要ES6或在Node 4.x中声明"use-strict")

更新:或者,更紧凑,取决于是否有任何逻辑或如果它是一个简单的任务:

const query_url = {complex : 'something'}[condition] || 'something-else';
Run Code Online (Sandbox Code Playgroud)

当然,还取决于那些switch语句中嵌入的外部逻辑的数量!


Dis*_*ure 9

您可以使用{}它来确定开关盒的范围。

对于您的情况,只要 var 存在并且可以在大括号之间访问,您就需要返回变量:

 switch(condition) {
    case 'complex': {
      const query_url = `something`;
      return query_url;
    }
    default: {
      const query_url = `something`;
      return query_url;
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果您不使用returnlet query_url,则必须在 switch 语句上方声明。


elt*_*ami 7

如果query_url取决于switch分支可以有多个值,显然你需要一个变量(用var或声明let).

const设置一次并保持这种状态.

let的示例用法

let query_url = '';
switch(condition) {
  case 'complex':
    query_url = `something`;
    break;
  default:
    query_url = `something`;
    break;
}
Run Code Online (Sandbox Code Playgroud)

  • 根本不是真的.检查@bergi的答案. (9认同)
  • @Kuf.是将case语句包装在一个块中解决了先前声明的错误.现在尝试在switch语句之外访问`query_url`.http://jsbin.com/givavumolu/edit?html,js,console,output然后享受你的downvote (3认同)
  • @eltonkamami虽然我觉得你的答案不值得投票,因为它正确地解决了这个问题,我确实质疑你为什么要在switch案例中声明一个变量并期望在该范围之外使用它. (3认同)
  • 请参阅下面的@Bergi答案 (3认同)
  • @eltonkamami 答案就足够了。问题询问如何避免重复定义错误,这就是这样做的。考虑将值 `query_url` 传递给另一个函数的情况。在这种情况下,`query_url` 是块范围的并不重要,因为它只是一个中间值。你无理取闹。 (2认同)