@thefourtheye вірно говорить, що до цих змін не можна отримати доступ до їх оголошення. Однак це трохи складніше, ніж це.
Чи змінні оголошуються змінними за допомогою letчи constні? Що насправді відбувається тут?
Всі декларації ( var, let, const, function, function*, class) є "звалили" в JavaScript. Це означає, що якщо ім'я оголошено в області застосування, в цій області ідентифікатор завжди посилається на цю конкретну змінну:
x = "global";
// function scope:
(function() {
x; // not "global"
var/let/… x;
}());
// block scope (not for `var`s):
{
x; // not "global"
let/const/… x;
}
Це справедливо як для функцій, так і для блоку 1 .
Різниця між var/ function/ function*деклараціями та let/ const/ classдеклараціями - це ініціалізація .
Перші ініціалізуються undefinedправою або (генераторною) функцією, коли прив'язка створюється у верхній частині області. Однак лексично оголошені змінні залишаються неініціалізованими . Це означає, що ReferenceErrorви намагаєтесь отримати доступ до нього. Він буде ініціалізований лише тоді, коли буде оцінено твердження let/ const/ class, усе раніше (вище), що називається тимчасовою мертвою зоною .
x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined
var x = "local";
let y = "local";
}());
Зауважте, що let y;оператор ініціалізує змінну з " undefinedlike" let y = undefined;.
Тимчасова мертва зона не є синтаксичним розташування, а , скоріше, час між змінним (масштабом) створенням та ініціалізацією. Це не помилка посилання на змінну в коді над декларацією, доки цей код не виконаний (наприклад, тіло функції або просто мертвий код), і він викине виняток, якщо ви отримаєте доступ до змінної перед ініціалізацією, навіть якщо доступ код знаходиться нижче декларації (наприклад, у оголошенні функції з піднімаються функціями, яке викликається занадто рано).
Чи є різниця між letі constв цьому питанні?
Ні, вони працюють так само, наскільки піднімаються. Єдина відмінність між ними полягає в тому, що constмураха повинна бути і може бути призначена лише в ініціалізаторській частині декларації ( const one = 1;як const one;і наступні перепризначення, такі one = 2як недійсні).
1: varДекларації все ще працюють лише на рівні функції, звичайно
let foo = () => bar; let bar = 'bar'; foo();ілюструє всі декларації з ефектом піднімання ще краще, оскільки це не очевидно через часову мертву зону.