Какова область применения ключевого слова let в ES6 (см. Фрагменты кода ниже) - PullRequest
0 голосов
/ 08 мая 2018

Название вопроса кажется простым, но я не об этом. Пожалуйста, попробуйте следующие примеры

for(let i=0; i<5; i++){
	//console.log(i);
	let i=5	
	console.log(i);
}

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

Я действительно смущен, что происходит ??

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Похоже, что многие люди говорят о настоящей путанице здесь ...

Хорошо, поэтому, когда вы говорите

// scope A
for(let i = 0; i<5; i++) {
    //scope B
}

мы знаем, i - это , а не , заявленный в области A. (Это одна из самых больших проблем, которые let решает.) Так что, похоже, это должно быть объявлено в области B. Но как насчет этого случая?

// scope A
for(let i = 0; i<5; i++) console.log(i);

Цикл for все же должен иметь свою собственную область видимости, чтобы i не попадал в область A. И мы можем продемонстрировать это.

let i = 37;
for(let i = 0; i < 5; i++) console.log(i);

console.log(i); // prints 37

Теперь, если оператор for уже имеет область действия, даже если у него нет фигурных скобок, то что произойдет, если мы заменим console.log(i) оператором блока? Хорошо, что оператор блока получает свою собственную область. Так что на самом деле у нас есть

// Scope A
for( //scope B is actually here
     let i = 0; i < 5; i++) {
    // Scope C
}
0 голосов
/ 08 мая 2018

Я думаю, что приведенный ниже код удалит все ваши сомнения. Это все о scope, вы не можете переопределить одну и ту же переменную в том же scope, но вы можете определить во вложенном scope

То же самое происходит в вашем коде for имеет собственную область видимости и внутри for означает

for { //inside this } is  nested scope of `for`.

{
    let a = "a";
    console.log(a);
    {
        let a = "b";
        console.log(a);
    }
    console.log(a);
}
0 голосов
/ 08 мая 2018

Для семантики let в for циклах см. Объяснение `let` и блока scoop с помощью для циклов .

Как можно объявитьдругая переменная с таким же идентификатором внутри for цикла?

Это потому, что ваш цикл for имеет оператор блока в качестве тела, и там вы можете объявить свой собственный блокпеременные, скрытые от родительских областей.

0 голосов
/ 08 мая 2018

В следующем примере вы устанавливаете значение i на 5, чтобы цикл завершался, потому что это условие для цикла i<5. Итак, условие ложно для повторного запуска цикла

for(let i=0; i<5; i++){
	//console.log(i);
	i=5	
	console.log(i);
}

И в вашем первом примере цикл продолжается, потому что let i =5 считается отдельной переменной в области действия цикла for

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...