@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;
оператор ініціалізує змінну з " undefined
like" let y = undefined;
.
Тимчасова мертва зона не є синтаксичним розташування, а , скоріше, час між змінним (масштабом) створенням та ініціалізацією. Це не помилка посилання на змінну в коді над декларацією, доки цей код не виконаний (наприклад, тіло функції або просто мертвий код), і він викине виняток, якщо ви отримаєте доступ до змінної перед ініціалізацією, навіть якщо доступ код знаходиться нижче декларації (наприклад, у оголошенні функції з піднімаються функціями, яке викликається занадто рано).
Чи є різниця між let
і const
в цьому питанні?
Ні, вони працюють так само, наскільки піднімаються. Єдина відмінність між ними полягає в тому, що const
мураха повинна бути і може бути призначена лише в ініціалізаторській частині декларації ( const one = 1;
як const one;
і наступні перепризначення, такі one = 2
як недійсні).
1: var
Декларації все ще працюють лише на рівні функції, звичайно
let foo = () => bar; let bar = 'bar'; foo();
ілюструє всі декларації з ефектом піднімання ще краще, оскільки це не очевидно через часову мертву зону.