Как работе 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 шт):
Ниже пример когда выведется два раза 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};
}
}