【问题标题】:Error Duplicate Const Declaration in Switch Case StatementSwitch Case 语句中的错误重复常量声明
【发布时间】:2016-06-15 06:08:20
【问题描述】:

我有以下代码,但收到错误“重复声明 query_url”。

  switch(condition) {
    case 'complex':
      const query_url = `something`;
      break;
    default:
      const query_url = `something`;
      break;
  }

我知道 query_url 被声明了两次,这是不对的。但我不知道如何解决这个问题。有人可以帮忙看看什么是正确的方法来完成这项工作吗?

【问题讨论】:

  • 在哪里需要使用query_url
  • 如果需要在switch语句之外使用query_url,则不能使用const
  • 查看@Bergi 的答案以获得最有用的回复(不知道为什么它在获得最多支持的情况下被隐藏在列表中)
  • @oldo.nicho 因为它没有被接受为答案

标签: javascript ecmascript-6


【解决方案1】:

如果您需要在每种情况下重新声明相同的变量,请参阅 @Bergi 's answer bellow

如果 query_url 可以根据 switch 分支有多个值,显然你需要一个变量(使用 varlet 声明)。

const 设置一次并保持不变。

let 的示例用法

let query_url = '';
switch(condition) {
  case 'complex':
    query_url = `something`;
    break;
  default:
    query_url = `something`;
    break;
}

【讨论】:

  • 完全不正确。检查@bergi 答案。
  • @eltonkamami 虽然我认为您的答案不值得一票否决,因为它正确地解决了这个问题,但我确实质疑您为什么要在 switch case 中声明一个变量并期望在该范围之外使用它.
  • 见下面@Bergi 的回答
  • @eltonkamami 答案就足够了。问题询问如何避免重复定义错误,这就是这样做的。考虑将值query_url 传递给另一个函数的情况。在这种情况下,query_url 是块作用域无关紧要,因为它只是一个中间值。你太苛刻了。
【解决方案2】:

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

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

 switch(condition) {
    case 'complex': {
      const query_url = `something`;
      return query_url;
    }
    default: {
      const query_url = `something`;
      return query_url;
    }
  }

如果您不使用return,则必须在您的 switch 语句上方声明 let query_url

【讨论】:

    【解决方案3】:
    const query_url={
      complex:'something complex',
      other:'other thing'
    }[condition]
    

    缺点是对象不能有默认值,需要额外检查条件。

    【讨论】:

      【解决方案4】:

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

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

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

      更新:或者,根据那里是否有任何逻辑或者它是否是一个简单的分配,更紧凑:

      const query_url = {complex : 'something'}[condition] || 'something-else';
      

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

      【讨论】:

        【解决方案5】:

        尝试将箱子包装成块:

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

        【讨论】:

        • 不知道为什么这被否决了,它解决了错误?
        • 嗯,query_url 不会被限制在定义它的块中,这会违背分配给它的全部目的吗?
        • @torazaburo:是的,它只用于那个区块。我不确定代码的实际用途是什么,您不应该只使用 switch 来选择单个值 - 对象(或 Map)查找更适合该任务。
        • 大吃一惊。我认为case 是块。感谢您的提示!
        • 谢谢!这是真正的解决方案。因为,在这种微不足道的情况下,显然您可以定义一个全局变量,但在更复杂的情况下,全局变量在大多数 switch 分支中可能是无意义的。
        【解决方案6】:

        只需将您的 switch 放入带有一些返回语句的函数中:

        var condition;
        function aSwitch(condition){
        switch(condition) {
            case 'complex':
              return 'something';
            default:
              return 'something';
          }
        }
        const query_url = aSwitch(condition);
        

        【讨论】:

        • 如果你不"use strict"; 你的代码会发生一些奇怪的事情。每个返回语句都在创建/分配一个全局变量查询 url。
        • @antoniskamamis 已编辑。感谢您的提示:)
        • 您只需要返回没有赋值的值,否则会创建全局或导致错误
        猜你喜欢
        • 1970-01-01
        • 2020-12-27
        • 2010-11-16
        • 2014-11-10
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多