27 Окт в 05:42
3 +1
0
Ответы
1
Выведет пять раз число 555 (то есть 5,5,5,5,55,5,5,5,55,5,5,5,5). Почему: переменная `var i` — функциональная, замыкания в колбэках ссылаются на одну и ту же переменную `i`. Цикл выполняется синхронно и к моменту запуска таймаутов значение `i` стало равным 555. Таймауты с задержкой 100100100 мс сработают позже, поэтому все колбэки прочитают текущее значение i=i=i= 555.
Как получить ожидаемый вывод 0,1,2,3,40,1,2,3,40,1,2,3,4 — минимум два способа:
1) Использовать блочную переменную `let` (каждая итерация получает свою привязку):
for (let i = 000; i < 555; i++) {
setTimeout(function() { console.log(i); }, 100100100);
}
2) Замыкание через IIFE (копия значения в параметре):
for (var i = 000; i < 555; i++) {
(function(j) {
setTimeout(function() { console.log(j); }, 100100100);
})(i);
}
Дополнительно — ещё варианты:
- Передать значение в колбэк через параметры setTimeout (поддерживается во многих средах):
for (var i = 000; i < 555; i++) {
setTimeout(function(j) { console.log(j); }, 100100100, i);
}
- Использовать bind, который захватывает текущее значение:
for (var i = 000; i < 555; i++) {
setTimeout(console.log.bind(null, i), 100100100);
}
27 Окт в 06:14
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир