Почему при использовании let in для инициализации цикла for переменная let не доступна во внешней области видимости? - PullRequest
4 голосов
/ 03 июня 2019

Для меня это всегда был давний вопрос: если блок-области создаются, когда идентификатор let или const заключен в фигурные скобки, то каков идентификатор let в операторе инициализации * 1004?* петля недоступна в прилагаемой области видимости, но вместо этого доступна внутри фигурных скобок петли for?

(function() {
  for (let i = 0; i < 5; i++) {
   console.log(i) // logs current value of i
  }
  console.log(i) // referenceError
})()

Ответы [ 3 ]

2 голосов
/ 03 июня 2019

Вот так все работает.Переменная, объявленная в верхней части цикла for, как эта, видна только внутри блока for текущей итерации.Вы можете думать об этом немного следующим образом:

<loop> {
  let i = getCount();
  console.log(i) // logs current value of i
}

, где getCount запускает логику, которая увеличивает i.

Переменные, объявленные с let, имеют область видимости - этоi не имеет смысла ссылаться снаружи.Если бы i был видимым вне for, как бы вы ожидали его значение?У вас уже есть отдельная привязка i для каждой итерации цикла.Было бы бессмысленно выбирать несколько таких произвольных привязок, чтобы они были видны снаружи.

0 голосов
/ 03 июня 2019

Если вы не хотите менять синтаксис, вы можете использовать var.

(function() {
    for (var i = 0; i < 5; i++) {
        console.log(i);
    }
    console.log(i); 
    // this should work.
})()

В противном случае переменная, объявленная с помощью let или const, имеет то, что называется Block Scope , означающее, что она видна только внутри фигурных скобок, в которых она была определена. По сути, это принципиальная разница между let и var. Переменная, объявленная с помощью var, имеет Область действия функции (Это видно по всей функции, даже до ее лексического определения, ее значение будет просто undefined)

(function() {
    console.log(i); // undefined
    var i = 10;
    console.log(i); // 10
 })();

Но приведенный выше пример будет работать, только если нигде нет "use strict".

0 голосов
/ 03 июня 2019

Поскольку это локальная переменная в цикле for, а не вне ее.Если вы объявили это вне цикла, вы могли бы получить к нему правильный доступ.

(function() {
  let i;
  for (i = 0; i < 5; i++) {
   console.log(i);
  }
  console.log(i);
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...