Switch Case 문에서 중복 Const 선언 오류


82

다음 코드가 있는데 'Duplicate Declaration query_url'오류가 발생합니다.

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

query_url이 옳지 않은 두 번 선언된다는 것을 이해합니다. 그러나 나는 이것을 해결하는 방법을 모른다. 누군가이 작업을 수행하는 올바른 방법이 무엇인지 도와 주시겠습니까?


4
어디에서 사용해야 query_url합니까?
Bergi

2
당신이 사용해야 할 경우 query_url외부 switch문, 당신은 사용할 수 없습니다 const.
Felix Kling

가장 유용한 응답을 참조 @Bergi 응답 (확실하지가가 지금까지 가장 upvotes에 의해이 목록을 아래로 자리 잡고 왜)
oldo.nicho

@ oldo.nicho 그것은 답으로 인정되지 않았기 때문에
루스에 무스

답변:


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 대답을 확인하십시오.
Kuf

4
@eltonkamami 질문을 제대로 처리하기 때문에 귀하의 답변이 반대 투표를 할 가치가 없다고 생각하는 동안 스위치 케이스 내에서 변수를 선언하고 해당 범위 밖에서 사용할 것으로 예상하는 이유에 대해 질문합니다.
toddg

3
아래 @Bergi의 답변을 참조하십시오
oldo.nicho

2
@eltonkamami 대답으로 충분합니다. 이 질문은 중복 정의 오류를 방지하는 방법을 묻습니다. 값 query_url이 다른 함수에 전달 된 경우를 고려하십시오 . 이 경우 query_url단순히 중간 값이기 때문에 블록 범위가 중요하지 않습니다 . 당신은 불합리하게 가혹합니다.
Patrick Michaelsen

339

케이스를 블록으로 포장 해보십시오.

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

7
왜 이것이 비추천인지 확실하지 않으면 오류가 해결됩니까?
Bergi

1
음, query_url그것이 정의 된 블록에 국한 되지 않을 것입니다. 어떤 종류의 할당 목적 전체를 훼손합니까?

3
@torazaburo : 예, 해당 블록에서만 사용됩니다. 코드의 실제 목적이 무엇인지 잘 모르겠습니다 switch. 단일 값을 선택하는 데만 사용해서는 안됩니다 . 객체 (또는 Map) 조회가 해당 작업에 더 적합합니다.
Bergi

9
마음을 날려. 나는 case블록으로 생각 했습니다. 이 힌트에 감사드립니다!
Andreyco 2016-04-27

3
감사합니다 ! 이것이 진정한 해결책입니다. 이 사소한 경우에는 분명히 전역 변수를 정의 할 수 있지만 더 복잡한 경우 전역 변수는 대부분의 스위치 분기에서 의미가 없을 수 있습니다.
Emrys Myrooin

14

나는 이러한 종류의 경우에 개인적으로 다음을 선호하고 남용하는 경향이 있습니다.

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 문에 포함 된 외부 논리의 양에 따라 달라집니다!


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;
    }
  }

사용하지 않을 경우returnlet query_url 스위치 문 위에 선언해야합니다 .


1

switchreturn 문을 사용하여 함수에 넣으십시오 .

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 편집 됨. :) 팁을위한 감사합니다
자카 리아

당신은 단지 중 오류가 글로벌을 만들거나 원인이됩니다 할당하지 않고 값을 반환해야
eltonkamami
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.