开关案例语句中的错误重复常量声明


78

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

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

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


4
您需要在哪里使用query_url
Bergi'3

2
如果您需要query_urlswitch语句之外使用,则不能使用const
菲利克斯·克林

参见@Bergi答案以获取最有用的答复(不确定为什么它的投票最多时将其隐藏在列表中)
oldo.nicho

@ oldo.nicho因为它没有被接受作为答案
驼鹿

Answers:


10

如果您需要在每种情况下重新声明相同的变量,请参见下面的@Bergi答案

如果query_url可以根据开关分支有多个值,显然您需要一个变量(用var或声明let)。

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

let的示例用法

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

15
根本不是真的。检查@bergi答案。
库夫

4
@eltonkamami虽然我认为您的答案正确解决了问题,但我认为您的答案不应该被否决,但我确实质疑您为什么要在switch案例中声明一个变量,并期望在该范围之外使用它。
toddg

3
参见下面的@Bergi答案
oldo.nicho

2
@eltonkamami答案就足够了。该问题询问如何避免重复的定义错误,并且这样做。考虑将值query_url传递给另一个函数的情况。在这种情况下,query_url块作用域无关紧要,因为它只是中间值。你太过分了。
帕特里克·迈克尔森

328

尝试将案例包装成块:

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

7
不知道为什么要拒​​绝它,它可以解决错误?
Bergi'3

1
嗯,将不会query_url仅限于定义它的块,哪一种会破坏分配给它的整个目的?

3
@torazaburo:是的,仅在该代码块中使用。我不确定代码的实际用途是什么,您不应该switch仅使用一个来选择一个值-对象(或Map)查找更适合该任务。
Bergi'3

7
精神震撼。我认为case是块。感谢您的提示!
Andreyco '16

3
谢谢 !这是真正的解决方案。因为在这种琐碎的情况下,您显然可以定义全局变量,但是在更复杂的情况下,全局变量在大多数开关分支中可能都是无意义的。
Emrys Myrooin '16

14

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

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

(这需要ES6或在节点4.x中声明“使用限制”)

更新:或者,根据是否有逻辑或简单的分配,更为紧凑:

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

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


2
const query_url={
  complex:'something complex',
  other:'other thing'
}[condition]

缺点是,您不能对对象使用默认值,而需要对条件进行附加检查。


2

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

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

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

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


1

只需将您switch的函数放入一些return语句中即可:

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

如果您不做"use strict";一些奇怪的事情,您的代码将会发生。每个return语句都在创建/声明一个全局变量查询url。
eltonkamami

@antoniskamamis编辑。感谢您的提示:)
Zakaria

您只需要返回该值,而无需进行分配即可创建全局值或导致错误
eltonkamami
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.