В чем разница между «для (пусть элемент iter)» и «для (элемент iter)» в JavaScript - PullRequest
2 голосов
/ 01 марта 2020

Я часто использую оператор for для обхода итератора, как показано ниже:

for(item of myIterator){
    console.log(item)
}

Но недавно я обнаружил, что официальное утверждение:

for(let item of myIterator){
    console.log(item)
}

И они оба выполняют правильно, интересно, есть ли у них какая-то разница. Thx!

Ответы [ 3 ]

2 голосов
/ 01 марта 2020

Let - это переменная в области видимости, поэтому она будет работать только внутри своей области видимости {}.

var myIterator = [0,1,2,3]

//non scoped variables works also out of for-loop, check
for(item of myIterator){
    console.log(item)
}

console.log(item)

В приведенном выше примере будут напечатаны все элементы, а по завершении переменная item все еще остается последним элементом итерации. Now попробуйте еще раз с переменной let scoped

//scoped variables works only inside for-loop instruction
for(let item2 of myIterator){
    console.log(item2)
}

console.log(item2)

Теперь item2 больше недоступен, поскольку находится вне области действия, и инструкция сгенерирует ошибку.

0 голосов
/ 01 марта 2020

Использование let таким образом позволит вам избежать случайного создания замыкания, если вы вызываете функцию в вашем l oop и передаете счетчик в качестве параметра.

0 голосов
/ 01 марта 2020

Когда вы используете переменную, которая еще не объявлена, javascript объявит ее в текущей области действия функции или в глобальной области объекта (также известной как window в браузере или global в node.js), это то же самое поведение, когда вы используете ключевое слово var для объявления переменной.

Итак, ваш первый " for of " создаст переменная с именем item, которая доступна за пределами для scope.

Ключевое слово let имеет область видимости блока, поэтому оно доступно только внутри для l oop.

const arr = [1, 2, 3]

for (item of arr) {
    console.log(item)
}

for (let item2 of arr) {
    console.log(item)
}

console.log(item)
console.log(item2)

Второй файл console.log завершится с ошибкой ReferenceError : item2 не определен.

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