Fehler beim Duplizieren der Const-Deklaration in der Switch-Case-Anweisung


78

Ich habe den folgenden Code und erhalte die Fehlermeldung 'Duplicate Declaration query_url'.

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

Ich verstehe, dass query_url zweimal deklariert wird, was nicht richtig ist. Aber ich weiß nicht, wie ich das lösen soll. Kann mir bitte jemand helfen, wie dies richtig funktionieren soll?


4
Wo müssen Sie verwenden query_url?
Bergi

2
Wenn Sie query_urlaußerhalb der switchAnweisung verwenden müssen, können Sie nicht verwenden const.
Felix Kling

Siehe @Bergi Antwort für die nützlichste Antwort (nicht sicher, warum es in der Liste versteckt ist, wenn es bei weitem die meisten Upvotes hat)
oldo.nicho

@ oldo.nicho Weil es nicht als Antwort akzeptiert wurde
Moose on the Loose

Antworten:


10

Wenn Sie jeweils dieselbe Variable neu deklarieren müssen, lesen Sie die Antwort von @Bergi unten

Wenn query_urlje nach Switch-Zweig mehrere Werte vorliegen können, benötigen Sie offensichtlich eine Variable (entweder mit varoder deklarieren let).

const wird einmal gesetzt und bleibt so.

Beispiel Verwendung mit let

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

15
Einfach nicht wahr. check @bergi Antwort.
Kuf

4
@eltonkamami Obwohl ich nicht der Meinung bin, dass Ihre Antwort eine Abwertung verdient, da sie die Frage richtig anspricht, frage ich mich, warum Sie eine Variable in einem Switch-Fall deklarieren und erwarten würden, sie außerhalb dieses Bereichs zu verwenden.
Toddg

3
Siehe @Bergi Antwort unten
oldo.nicho

2
@eltonkamami die Antwort ist ausreichend. In der Frage wird gefragt, wie doppelte Definitionsfehler vermieden werden können. Betrachten Sie den Fall, in dem der Wert query_urlan eine andere Funktion übergeben wurde. In diesem Fall spielt es keine Rolle, dass query_urles sich um einen Blockbereich handelt, da es sich lediglich um einen Zwischenwert handelt. Sie sind unangemessen hart.
Patrick Michaelsen

328

Versuchen Sie, die Fälle in Blöcke zu verpacken:

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

7
Nicht sicher, warum dies herabgestuft wurde, es behebt den Fehler?
Bergi

1
Ähm, beschränken Sie sich nicht query_urlauf den Block, in dem er definiert ist. Welche Art von Niederlage besiegt den gesamten Zweck der Zuweisung?

3
@torazaburo: Ja, es darf nur in diesem Block verwendet werden. Ich bin mir nicht sicher, was der eigentliche Zweck des Codes ist. Sie sollten nicht switchnur a verwenden, um einen einzelnen Wert auszuwählen. Eine Objekt- (oder Map) Suche ist für diese Aufgabe besser geeignet.
Bergi

7
verblüfft. Ich betrachtete caseals Block. Danke für diesen Hinweis!
Andreyco

3
Danke ! Dies ist die wirkliche Lösung. Da Sie in diesem trivialen Fall eindeutig eine globale Variable definieren können, kann die globale Variable in einem komplexeren Fall in den meisten Switch-Zweigen unsinnig sein.
Emrys Myrooin

14

Ich persönlich bevorzuge (und neige dazu, dies zu missbrauchen) in solchen Fällen:

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

(Dies erfordert jedoch ES6 oder die Deklaration von "use-strict" in Node 4.x)

Update: Alternativ viel kompakter, je nachdem, ob es eine Logik gibt oder ob es sich um eine einfache Aufgabe handelt:

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

Dies hängt natürlich auch von der Menge an externer Logik ab, die in diesen switch-Anweisungen eingebettet ist!


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

Der Nachteil ist, dass Sie mit dem Objekt keine Standardeinstellung haben können. Sie müssen zusätzlich die Bedingung überprüfen.


2

Sie können verwenden, {}um Ihren Schalterfall zu erfassen.

Für Ihren Fall müssen Sie die Variable zurückgeben, solange die Variable vorhanden ist und zwischen geschweiften Klammern verfügbar ist:

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

Wenn Sie nicht verwendenreturn , müssen Sie eine let query_urlüber Ihrer switch-Anweisung deklarieren .


1

Fügen Sie einfach switcheine Funktion mit einigen return-Anweisungen ein:

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

Wenn Sie dies nicht tun, werden "use strict";einige seltsame Dinge mit Ihrem Code auftreten. Jede return-Anweisung erstellt / verknüpft eine globale Variablenabfrage-URL.
eltonkamami

@antoniskamamis bearbeitet. Danke für den Tipp :)
Zakaria

Sie müssen nur den Wert ohne eine Zuweisung zurückgeben, die entweder eine globale oder einen Fehler verursacht
eltonkamami
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.