Использование let в REPL

238
19 марта 2017, 05:46

Если объявить переменную через 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) та же проблема:

Answer 1

Перевод ответа @Bergi

это случается когда в глобальном скопе появляется временная мертвая зона. Как ты можешь знать, определения let всплывают, но остаются неинициализироваными. Из-за потока выполнения, в некоторых случаях переменные могут быть никогда не инициализированы:

function …() {
    if (false)
        example; // при выполнении кинет исключение ReferenceError
    … // какие-то действия
    if (true)
        return; // выход!
    let example = 5; // никогда не выполнится
}

Все хорошо, если речь идет о функциональном скопе. Может быть, что-то пойдет не так, может быть переменная вообще не понадобится - при следующем вызове будет создан новый скоп с новой переменной.

Что-то похожее происходит и в глобальном скопе, когда исключение случается до инициализации переменной (только исключение работает тут, как конструкция потока управления, больше ничего не может вызвать тот же эффект).

throw new Error;
let example = 5;

В отличие от функционального скопа, очень важно, что в данном случае переменная осталась неинициализированной. Глобальный скоп постоянен, и переменная постоянно мертва. Она никогда не будет инициализирована, и лексические переменные невозможно будет переопределить (что поможет избежать ошибок).

Это обсуждали на es-discuss, но сочли несущественным. Если при выполнении скриптов на глобальном уровне кидается ошибка, то у вас есть проблемы побольше, чем неинициализированные переменные. Нет возможности восстановления. Если вам это нужно (например, попытаться переопределить переменную в успешных скриптах), вы в любом случае должны использовать var.

READ ALSO
Как динамически отправить форму?

Как динамически отправить форму?

Подскажите как реализовать выход с аккЕсть ссылка и по нажатию отправляется динамически форма, с помощью пост запроса, на указанный url

247
Collapse Bootstrap на чистом JQuery

Collapse Bootstrap на чистом JQuery

Помогите верстать это местоВ Bootstrap'е оно называется Collapse

286
Блокировка скроллинга

Блокировка скроллинга

Раньше блокировал так:

229
Как сделать редирект на любой URI?

Как сделать редирект на любой URI?

Как перенаправить клиента на новую страницу при помощи JS/jQuery? Перевод вопроса "How to redirect to another webpage in JavaScript/jQuery?"

216