Помилка Повторювана декларація Const у заяві про справу комутатора


82

У мене є такий код, і я отримую помилку "Повторне оголошення query_url".

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

Я розумію, що query_url двічі оголошується, що неправильно. Але я не знаю, як це вирішити. Чи може хтось допомогти, як правильно це зробити?


4
Де потрібно використовувати query_url?
Бергі

2
Якщо вам потрібно використовувати query_urlпоза switchтвердження, ви не можете використовувати const.
Фелікс Клінг

Дивіться відповідь @Bergi, щоб отримати найкориснішу відповідь (не впевнений, чому вона вилучена зі списку, коли вона має на сьогоднішній день найбільше голосів)
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.
Куф,

4
@eltonkamami, хоча я не вважаю, що ваша відповідь заслуговує голосу проти, оскільки вона належним чином вирішує питання, я сумніваюся, чому ви оголошуєте змінну у випадку перемикача та сподіваєтесь використовувати її поза цим обсягом.
toddg

3
Дивіться відповідь @Bergi нижче
oldo.nicho

2
@eltonkamami відповіді достатньо. Питання задає питання, як уникнути помилок, що повторюються у визначенні, і це робить це. Розглянемо випадок, коли значення query_urlпередається іншій функції. У цьому випадку неважливо, що query_urlце блок-сфера дії, оскільки це просто проміжне значення. Ви невиправдано жорсткі.
Патрік Майклсен,

339

Спробуйте обернути справи у блоки:

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

7
Не знаєте, чому це було проти, це усуває помилку?
Бергі

1
Гммм, чи не query_urlобмежиться блоком, де він визначений, який тип перемагає всю мету його призначення?

3
@torazaburo: Так, це лише для використання в цьому блоці. Я не впевнений, що справжнє призначення коду, ви не повинні використовувати switchлише для вибору одного значення - Mapдля цього завдання краще підходить пошук об'єкта (або ).
Бергі

9
розум підірваний. Я розглядав caseяк блок. Дякую за цю підказку!
Андрейко

3
Дякую ! Це справжнє рішення. Оскільки в цьому тривіальному випадку ви можете чітко визначити глобальну змінну, але в більш складних випадках глобальна змінна може бути нечутливою для більшості гілок комутатора.
Emrys Myrooin

14

Я особисто віддаю перевагу (і, як правило, зловживаю) наступним у таких випадках:

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

(для цього потрібен ES6 або декларація "суворого використання" у Node 4.x)

Оновлення: Альтернативно, набагато компактніше, залежно від того, чи є там якась логіка чи це просте призначення:

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

Також, звичайно, це залежить від кількості зовнішньої логіки, вбудованої в ці оператори комутатора!


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вищезазначену операцію перемикання.


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 Відредаговано. Дякую за підказку :)
Закарія

вам просто потрібно повернути значення без присвоєння, яке або створить глобальний, або спричинить помилку
eltonkamami 02.03.16
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.