Подъем и "пусть" в JavaScript

Вопрос:

почему это не вызывает ошибку ссылки:

console.log(a)
let a = 5;

но это выдает ошибку ссылки:

{
 console.log(a)
 let a = 5;
}

Теперь, если мы используем 'var', то в обоих случаях код будет выполняться и выходить из системы 'undefined', но кто-то может объяснить, что происходит с 'let' (и 'const').

1 ответ

Как указано в комментариях, оба из них выдают ошибку ссылки.

console.log(a)
let a = 5;

{
 console.log(a)
 let a = 5;
}

Но вы правы. Если вы используете var затем undefined вошел в консоль.

console.log(a)
var a = 5;

Из поста в блоге, который написан не мной, где вы можете узнать больше об этом.

Механизм JavaScript обрабатывает все объявления переменных, используя "var", как если бы они были объявлены в верхней части функциональной области (если она объявлена ​​внутри функции) или глобальной области (если она объявлена ​​вне функции) независимо от того, где происходит фактическое объявление. По сути, это "подъем".

Это относится только к var, let а также const выдаст ошибки ссылки и хорошо документирован (см. спецификацию ECMAScript 2015). Это потому что хотя let а также const они не инициализируются до тех пор, пока код не выполнит строку инициализации. Время между let или же const Подъем и инициализация обычно известны как временная мертвая зона.

Другие вопросы по тегам