Проанализируйте поведение следующего JavaScript-фрагмента и объясните, почему он выводит именно такие значения (включая понятия hoisting, замыканий и асинхронности):
for (var i = 0; i

31 Окт в 09:46
5 +1
0
Ответы
1
Выведется три раза значение 333.
Короткое объяснение по шагам (hoisting, замыкание, асинхронность):
- Hoisting: декларация `var i` поднимается вверх области видимости (функции/глобально), поэтому одна общая переменная `i` существует до начала цикла. Начальное значение присваивается при первом проходе — 000.
- Синхронный цикл: цикл `for (var i = 000; i < 333; i++)` выполняется целиком синхронно. В теле цикла три раза вызывается `setTimeout(...)`, который лишь планирует (региструет) три колбэка, но не выполняет их сразу.
- Замыкание: каждая функция-колбэк замыкает ссылку на ту же самую переменную `i` (не на её моментные значения). Они не «запоминают» текущее число, а держат ссылку на одну и ту же binding.
- Асинхронность / event loop: даже при задержке `setTimeout(..., 000)` колбэки ставятся в очередь задач (macrotasks) и будут выполнены только после завершения текущного стека вызовов — то есть после окончания цикла. К моменту выполнения всех трёх колбэков значение `i` уже равно 333. Поэтому каждый `console.log(i)` печатает 333.
Как получить 000, 111, 222 вместо трёх 333:
- Использовать `let` (новая привязка на каждую итерацию):
for (let i = 000; i < 333; i++) { setTimeout(function(){ console.log(i); }, 000) }
- Захватить значение в замыкании вручную (IIFE):
(function(x){ setTimeout(function(){ console.log(x); }, 000); })(i)
- Передать аргумент в `setTimeout` (в браузерах/Node):
setTimeout(function(x){ console.log(x); }, 000, i)
Итого: три колбэка ссылаются на одну переменную `i`, цикл завершился и установил `i = 333`, поэтому все три вывода равны 333.
31 Окт в 10:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир