Если объявить переменную через let в строке, вызывающей ошибку ReferenceError, то потом использовать это имя переменной что-то не получается. delete не помогает.
let justSomeVar = itHaveNeverExisted // ReferenceError: itHaveNeverExisted is not defined
let justSomeVar = 0 // TypeError: Identifier 'justSomeVar' has already been declared
justSomeVar = 0 // ReferenceError: justSomeVar is not defined
Что можно сделать, чтобы нормально продолжать работать (без перезапуска nodejs) и всё-таки объявить переменную с этим именем?
Вервия nodejs 6.5.0.
В консоли Google Chrome 56.0.2924.87 (64-bit) та же проблема:
Перевод ответа @Bergi
это случается когда в глобальном скопе появляется временная мертвая зона. Как ты можешь знать, определения let всплывают, но остаются неинициализироваными. Из-за потока выполнения, в некоторых случаях переменные могут быть никогда не инициализированы:
function …() {
if (false)
example; // при выполнении кинет исключение ReferenceError
… // какие-то действия
if (true)
return; // выход!
let example = 5; // никогда не выполнится
}
Все хорошо, если речь идет о функциональном скопе. Может быть, что-то пойдет не так, может быть переменная вообще не понадобится - при следующем вызове будет создан новый скоп с новой переменной.
Что-то похожее происходит и в глобальном скопе, когда исключение случается до инициализации переменной (только исключение работает тут, как конструкция потока управления, больше ничего не может вызвать тот же эффект).
throw new Error;
let example = 5;
В отличие от функционального скопа, очень важно, что в данном случае переменная осталась неинициализированной. Глобальный скоп постоянен, и переменная постоянно мертва. Она никогда не будет инициализирована, и лексические переменные невозможно будет переопределить (что поможет избежать ошибок).
Это обсуждали на es-discuss, но сочли несущественным. Если при выполнении скриптов на глобальном уровне кидается ошибка, то у вас есть проблемы побольше, чем неинициализированные переменные. Нет возможности восстановления. Если вам это нужно (например, попытаться переопределить переменную в успешных скриптах), вы в любом случае должны использовать var.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей