Как сохранить индекс итерации для setTimeout?

Let в заголовке цикла создаёт отдельную привязку для каждой итерации. При сохранении var передайте текущее значение аргументом функции, создающей отдельное окружение.

Короткий ответ

Что ответить на собеседовании

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);
}

Оба варианта сохраняют значение до окончания цикла. Изменение задержки таймера проблему общей переменной не решает. Важно не запускать оба варианта вместе при проверке ожидаемых трёх сообщений: это два самостоятельных решения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее