Повторная инициализация цикла for in - PullRequest
0 голосов
/ 03 октября 2018

Я обнаружил немного странное поведение в этом коде:

for (let i = 1; i < 2; i++) {
  let i = 10;
  console.log(i);
}

Я ожидал, что он выдаст ошибку синтаксиса из-за двойного объявления, но он работает и печатает 10. Может быть, кто-нибудь может объяснить?Почему это не та же среда и выполняет теневое копирование?Спасибо

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы не можете повторно объявить одну и ту же переменную в пределах той же области действия.

let scope = "declaration one";
let scope = "declaration two"; //error

Однако каждая область может иметь собственное объявление переменной, и внутренние области могут переопределять родительские области, но только временно, пока эта область сохраняется.

let scope = "outer scope";

if (true) {
  let scope = "inside if scope";
  console.log(scope);
}

console.log(scope);

{
  let scope = "inside block scope";
  console.log(scope);
}

console.log(scope);

Итак, с циклом for фаза инициализации составляет перед новой областью, введенной телом, поэтому вы можете повторно объявитьпеременная внутри.

0 голосов
/ 03 октября 2018

В той же области вы не можете повторно объявить некоторую переменную.Область действия определяется curly brace/{}.В пределах {} вы не можете повторно объявить некоторую переменную.Попробуйте это

for (let i = 1; i < 2; i++) {
    let i = 10;
    let i = 20;
    console.log(i);
}

Это выдаст ошибку.Потому что i здесь повторно заявлено.Путаница связана с управляющей переменной цикла i.Управляющая переменная имеет ссылку на область видимости цикла.Управляющая переменная i не входит в область заявленных значений i в пределах {}.Вот почему это работает.

0 голосов
/ 03 октября 2018

Вы можете переопределять и перезаписывать переменные let в пределах области действия функции.Когда переменные let будут объявлены в той же области видимости, вы столкнетесь с ошибкой, сообщающей, что let i уже определена. Этот пост довольно хорошо освещает это.

Одна из главных причин использования переменных let - это когда вы работаете с ограниченной памятью, поскольку переменные let строги.Однако вы можете работать с переменной внутри области действия функции, так как изменение переменной находится только внутри этой области.Синтаксическая ошибка, на которую вы ссылаетесь в своем вопросе, возникает, только когда переменная повторно объявлена ​​в той же области.

...