Let в заголовке цикла создаёт отдельную привязку для каждой итерации. При сохранении var передайте текущее значение аргументом функции, создающей отдельное окружение.
Как сохранить индекс итерации для setTimeout?
Let в заголовке цикла создаёт отдельную привязку для каждой итерации. При сохранении var передайте текущее значение аргументом функции, создающей отдельное окружение.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Код for(var i=0;i<3;i++){setTimeout(()=>console.log(i),0);} печатает три тройки. Нужно получить 0, 1, 2. Дайте исправление с let и вариант, в котором var остаётся.
Ответ
Let в заголовке цикла создаёт отдельную привязку для каждой итерации. При сохранении var передайте текущее значение аргументом функции, создающей отдельное окружение.
for (let i = 0; i < 3; i++) setTimeout(() => console.log(i), 0);
// Альтернатива:
for (var i = 0; i < 3; i++) {
((saved) => setTimeout(() => console.log(saved), 0))(i);
}
Оба варианта сохраняют значение до окончания цикла. Изменение задержки таймера проблему общей переменной не решает. Важно не запускать оба варианта вместе при проверке ожидаемых трёх сообщений: это два самостоятельных решения.