Есть ли разница между объявленной и определенной переменной - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь записать следующие строки в консоли одну за другой

let x = y //throws error "Uncaught ReferenceError: y is not defined"
console.log(x) //throws error "ReferenceError: x is not defined"
let x = 3; //gives error "Uncaught SyntaxError: Identifier 'x' has already been declared"
x = 3 //ReferenceError: x is not defined

Теперь проблема в том, как может быть переменная , не определенная , и объявлено в то же время.Есть ли разница между обоими.

1 Ответ

0 голосов
/ 04 марта 2019
Переменная

A let или const может быть только объявлена ​​ один раз - то есть, когда у вас есть let <variableName> в области, вы объявили <variableName> в этой области и не можете объявитьэто снова в этой области.

Из ранее связанного вопроса :

Когда есть назначение, правая часть анализируется первой;если правая часть выдает ошибку, она никогда не попадает в левую часть, и переменная, объявленная с помощью let, никогда не будет правильно инициализирована;она останется в демилитаризованной зоне / временной мертвой зоне навсегда

Невозможно повторно объявить переменную, которая уже была объявлена, даже если попытка присвоения во время инициализации вызвала ошибку.

Но в строке 4 x = 3 должно выполнить правильное назначение и удалить x из TDZ.Но это также не удается.Я не понимаю, что

После того, как переменная инициализирована (например, let x выполняется), она может быть назначена.Но точно так же, как вы не можете назначить переменную до ее let инициализации, вы также не можете назначить переменную позже, когда ее инициализация не завершилась успешно:

x = 'foo';
let x = 'bar';

Ошибка:

Uncaught ReferenceError: x не определен

Это то же самое, чтопроисходит в консоли при попытке:

let x = y
// Uncaught ReferenceError: y is not defined
// x has not been initialized, so the next line throws:
x = 'foo'
// Uncaught ReferenceError: x is not defined

x все еще не инициализирован, поэтому ошибка такая же.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...