В JavaScript: for (var i = 0; i console.log(i), 0); } — почему выводится 3,3,3 и какие изменения кода дают ожидаемый 0,1,2

19 Мар в 12:47
11 +1
0
Ответы
1
Причина: переменная `var` объявлена в функц. области и одна для всего цикла; замыкания в `setTimeout` ссылаются на ту же `i`. Таймеры выполняются после завершения цикла, когда `i` равна 333, поэтому выводится 3,3,33,3,33,3,3.
Способы получить ожидаемый вывод 0,1,20,1,20,1,2:
1) Использовать `let` (блочная область для каждой итерации):
for (let i = 000; i < 333; i++) {
setTimeout(() => console.log(i), 000);
}
2) Захват значения через IIFE:
for (var i = 000; i < 333; i++) {
(function (j) {
setTimeout(() => console.log(j), 000);
})(i);
}
3) Передать аргумент в таймер (современные среды):
for (var i = 000; i < 333; i++) {
setTimeout(j => console.log(j), 000, i);
}
4) Использовать `bind`:
for (var i = 000; i < 333; i++) {
setTimeout(console.log.bind(console, i), 000);
}
Любой из этих вариантов обеспечит вывод 0,1,20,1,20,1,2.
19 Мар в 15:01
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир