for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 100);
}
- 5,980
-
чет у вас какая-то ерунда написана с ошибками – ThisMan Jul 19 '18 at 11:16
-
нормально отформатируйте пример. и явные опечатки исправьте – Lexx918 Jul 19 '18 at 11:17
-
2Выведет ошибку интерпретатора, потому что в коде допущена ошибка. – RTK Jul 19 '18 at 11:18
-
извините, вот переделанный код – Влад Бойко Jul 19 '18 at 11:30
-
2Возможный дубликат вопроса: Почему асинхронная функция внутри цикла выполняет последнюю итерацию много раз? – Jul 19 '18 at 12:04
1 Answers
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 100);
}
немного отсебятины:
человеку с инженерным образованием может быть проще понять так:
setTimeout - выполняется с задержкой (в данном случае в 100 мс)
в цикле
объявление
varвыделяет одну "ячейку" в памяти и на эту одну и туже "ячейку" всегда ссылается переменнаяiобъявление
letпри каждой итерации выделяет новую "ячейку", таким образом переменнаяiна каждом шаге перебора цикла ссылается на новый адрес.
Я считаю нецелесообразным лезть в высокие материи и пытаться связать let и scope, а предлагаю просто запомнить, как один из частных случаев использования циклов (for/for-in/for-of -- var/let).
Qwerty_Wasd:
Возможный дубликат вопроса: Почему асинхронная функция внутри цикла выполняет последнюю итерацию много раз?
хотя ответ, данный Peter Olson, хорош и рассматривает различные способы решения проблемы - его возраст насчитывает три года. думаю на сегодняшний день es2015(не путать с es5) не только можно, но и нужно считать нижней планкой для изучения js, поэтому акцентирую внимает на использовании let.
let © https://learn.javascript.ru/let-const#let
3. При использовании в цикле, для каждой итерации создаётся своя переменная.
Переменная var – одна на все итерации цикла и видна даже после цикла:
for (var i = 0; i < 10; i++) { /* … */ }
alert(i); // 10
С переменной let – всё по-другому.
Каждому повторению цикла соответствует своя независимая переменная let. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.
Это позволяет легко решить классическую проблему с замыканиями, описанную в задаче Армия функций.
Если бы объявление было var i, то была бы одна переменная i на всю функцию, и вызовы в последних строках выводили бы 10 (подробнее – см. задачу Армия функций).
А выше объявление let i создаёт для каждого повторения блока в цикле свою переменную, которую функция и получает из замыкания в последних строках.
- 4,962