Как работе for c let?

Если написать вот так:

for (let i = 0; i < 3; ++i) {
  setTimeout(() => console.log(i), 1000);
}

То будет выведено 0, 1, 2 , а не 3, 3, 3, как в случаи с var. Исходя из результатов этого примера, видно, что для каждой из функций в setTimeout в замыкании хранится своё i т.е логично предлоположить, что на каждой итерации цикла for создаётся своя переменная итаратор i.

Но если написать вот так:

var prev = null;
for (let i = {j: 0}; i.j < 3; ++i.j) {
  if (!prev) {
     prev = i;
  } else {
    console.log(prev == i);
    prev = i;
  }
} 

здесь уже было бы логично ожидать, что оба раза будет false, ведь из предыдучего примера сделали вывод, что на каждой итерации цикла, i будет пересоздано, а значит будет уже отличать по ссылке от объекта сохранённого в prev. Но на самом деле оба раза напичатает true

Подскажите, пожалуйста, как так получается?

Если i не пересоздаётся на каждой итерации, то почему в замыкании у каждой функции в замыкании оказывается свой i?


Ответы (1 шт):

Автор решения: Dmitrii Sedov

Ниже пример когда выведется два раза false. У Вас выводится true потому что идёт присвоение по ссылке. prev = i значит что в переменной prev будет ссылка на переменную i. В результате на новом этапе цикла после увеличения значения j, в переменной prev оно так же увеличится, в результате при сравнении выводится true

var prev = null;
for (let i = {j: 0}; i.j < 3; ++i.j) {
  if (!prev) {
     prev = {...i};
  } else {
    console.log(prev == i);
    prev = {...i};
  }
} 

→ Ссылка