Приведён фрагмент JavaScript: "for (var i = 0; i console.log(i), 0);" — объясните, что будет напечатано и как изменить код, чтобы вывести 0,1,2

29 Мая в 09:25
11 +1
0
Ответы
1
Будет напечатано три раза значение ......... — то есть последовательность ..., ..., ......,\ ...,\ ......, ..., ....
Коротко почему: переменная `var i` имеет функциональную область видимости. Цикл завершится, и к моменту срабатывания таймаутов `i` станет .......... Все три колбэка читают ту же переменную и выводят её текущее значение.
Как исправить (несколько вариантов):
1) Современный и простой — использовать `let`:
for (let i = 0; i console.log(i), 0);
Это выведет ..., ..., ......,\ ...,\ ......, ..., ..., потому что `let` даёт новую привязку `i` для каждой итерации.
2) Для старых сред — замкнуть значение в IIFE:
for (var i = 0; i < 3; i++) {
(function(j) {
setTimeout(() => console.log(j), 0);
})(i);
}
Здесь в замыкании сохраняется текущее `j = i`, поэтому вывод будет ..., ..., ......,\ ...,\ ......, ..., ....
3) Ещё варианты:
- Использовать `bind`: for (var i = 0; i < 3; i++) setTimeout(console.log.bind(null, i), 0);
- Передавать аргумент в `setTimeout` (поддерживается в средах): for (var i = 0; i console.log(j), 0, i);
Любой из этих способов обеспечит вывод ..., ..., ......,\ ...,\ ......, ..., ....
29 Мая в 09:30
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир