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

19 Ноя в 10:17
2 +1
0
Ответы
1
Выведется три раза 333. Почему: `var i` — одна переменная (function-scoped), замыкания в стрелочных функциях захватывают ссылку на эту переменную, а колбэки `setTimeout(..., 0)` выполняются позже (после завершения синхронного цикла) — к моменту выполнения цикла `i` стало 333.
Как получить вывод 0,1,20,1,20,1,2 (несколько способов):
1) Использовать блочную переменную `let` в цикле (каждая итерация — своё связывание):
```js
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
```
2) Замкнуть текущее значение в IIFE (в каждой итерации создаётся новая переменная `j`):
```js
for (var i = 0; i < 3; i++) {
(function (j) {
setTimeout(() => console.log(j), 0);
})(i);
}
```
3) Передать значение как аргумент `setTimeout` (значение фиксируется при планировании):
```js
for (var i = 0; i < 3; i++) {
setTimeout(console.log, 0, i);
}
```
(Аналогично можно использовать `setTimeout(console.log.bind(null, i), 0)` или внутри цикла делать `let j = i;` и логировать `j`.)
Коротко о причине: замыкание хранит ссылку на переменную `i`, а не её моментальное значение; и задержка (`setTimeout`) откладывает вызов до тех пор, пока цикл не завершится.
19 Ноя в 10:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир