let
переменные должны быть подняты как все другие типы объявления.
let
переменные не подняты, в отличие от var
переменных иобъявления функций и классов.const
переменные одинаковы.
Переменная не существует, пока вы не достигнете строки, где она объявлена.
Однако , вы не можете получить доступ к переменнойв соответствующей области, пока вы не достигнете декларацииЭто несколько бесполезно известно как временная мертвая зона .( Полезный блог 2ality )
Это полезно, поскольку доступ к переменной до ее объявления почти всегда является ошибкой.Или, по крайней мере, это сбивает с толку и приведет к ошибкам при рефакторинге.
function foo(n){
for (let i = 0; i < n; i++) {
// i cannot be accessed
let i = 10;
// i is set to 10
}
}
foo(4);
Что касается того, почему это не ошибка "идентификатор уже объявлен", область действия переменной, объявленной вЗаголовок цикла for
является отдельной переменной от объявленной в блоке.По сути, в этом коде три области действия: внешняя, начальная в заголовке цикла for
и начальная в блоке, окруженном {}
.