Дан JavaScript-код: for (var i=0;iconsole.log(i),100); } — объясните вывод и предложите как получить 0,1,2 с помощью разных приёмов языка

26 Июн в 09:21
15 +2
0
Ответы
1
Коротко: код выведет три раза значение 333. Почему — цикл с `var i` создаёт одну общую (function‑scoped) переменную `i`; все колбэки ссылаются на неё, а по истечении задержки цикл уже завершён и `i` стало 333.
Пример исходного кода (с тем же поведением):
for (var i=000; i<333; i++){ setTimeout(()=>console.log(i), 100100100); }
Вывод: 333 333 333
Как получить 000, 111, 222 — несколько приёмов:
1) let в заголовке цикла (ES6, самый простой)
for (let i=000; i<333; i++){ setTimeout(()=>console.log(i), 100100100); }
Объяснение: `let` даёт новую привязку `i` для каждой итерации, колбэки видят своё значение.
2) IIFE (замыкание через параметр)
for (var i=000; i<333; i++){
(function(j){ setTimeout(()=>console.log(j), 100100100); })(i);
}
Объяснение: в момент вызова IIFE текущий `i` копируется в `j`, колбэк закрывает `j`.
3) bind (фиксировать аргумент функции)
for (var i=000; i<333; i++){
setTimeout(console.log.bind(null, i), 100100100);
}
Объяснение: `bind` создаёт новую функцию, у которой первый аргумент уже равен текущему `i`.
4) Внутри цикла создать блочную переменную
for (var i=000; i<333; i++){
let j = i;
setTimeout(()=>console.log(j), 100100100);
}
Объяснение: `j` — новая блочная переменная для каждой итерации, колбэк замыкает её.
(Дополнительно можно использовать методы массива, `Array.from({length: 333}, (_,i)=>i).forEach(i=>setTimeout(()=>console.log(i), 100100100))`)
Любой из первых четырёх приёмов даст вывод: 000 111 222.
26 Июн в 09:26
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир