Объявления переменных var
поднимаются - инициализация имени переменной поднимается в верхнюю часть содержащей функции (или, если функции нет, в верхнюю часть внешнего блока). Так
var withVar = (function() {throw 'error!'})()
интерпретируется переводчиком как
var withVar;
withVar = (function() {throw 'error!'})()
То же самое не верно для let
- let
переменные инициализируются после запуска строки let __
. Когда есть назначение, правая сторона анализируется первой; если правая часть выдает ошибку, она никогда не попадает в левую, а переменная, объявленная с let
, никогда не инициализируется должным образом; он останется в демилитаризованной зоне / временной мертвой зоне навсегда , поэтому попытка переназначения выдает ошибку.
Это немного странно, потому что код запускается в консоли - обычно JS запускается внутри тега <script>
, и если возникает такая ошибка, обычно не более код будет выполняться, и тот факт, что переменная, объявленная с let
, больше не может быть переназначена, - это наименьшее из ваших беспокойств.