Это старый ответ. Я написал немного более новый ответ , касающийся аналогичных проблем "const re-assignment / scope", где я показываю, что возникающие ошибки, если таковые имеются, различаются в зависимости от метода выполнения и браузера.
Поскольку const
(который не является частью стандарта ECMAScript 5-го издания) имеет значение различное в ECMAScript 6-м издании, я бы рекомендовал избегать его в текущем коде.
const
, как и var
, имеет «функциональную область». Я подозреваю, проблема возникает из-за того же вида повышения "на вершину функции" в привязке , что происходит с var
(это объясняет, почему исключение не происходит из назначения но из декларации). То есть любые последующие const x = ...
, везде, где они появляются , считаются недействительными, поскольку предыдущее объявление уже существует (по определению может быть только один констант данного имени на область действия ). Однако const
может принимать любое значение, поэтому назначение происходит на сайте const x = ...
, так же, как назначение происходит на сайте var x = ...
, даже несмотря на то, что аннотация / привязка была повышена до верхнего уровня. объема.
Вот простой тестовый пример, который более четко демонстрирует проблему:
function x () { if (true) { const a = 1 } else { const a = 2 }}
// => TypeError: redeclaration of const a @ <x-jsd:interactive-session
Как видите, ошибка возникает при объявлении функции и , а не при выполнении функции. Вот почему try / catch не работает. Поведение также может зависеть от интерактивного инструмента, с которым вы имеете дело, в зависимости от того, как он выполняет код (например, это один и тот же контекст выполнения каждый раз?).
Тем не менее, это прекрасно работает и подкрепляет первоначальное предложение выше:
(function x() { if (false) { const c = 1 }; return c })()
// => undefined
С https://developer.mozilla.org/en/JavaScript/Reference/Statements/const
(выделено жирным шрифтом)
Создает константу, которая может быть глобальной или локальной для функции, в которой она объявлена. Константы соответствуют тем же правилам области видимости, что и переменные.
Значение константы не может быть изменено путем переназначения, и константа не может быть повторно объявлена. Из-за этого, хотя можно объявить константу без ее инициализации, это было бы бесполезно.
Константа не может делиться своим именем с функцией или переменной в той же области.
const является специфичным для Mozilla расширением , оно не поддерживается IE, но частично поддерживается Opera начиная с версии 9.0 и Safari.