Witam, ostatnio gdzieś na forum w którymś z tematów Comaander polecil ksiazke nt. JavaScriptu, uznałem że wezmę się za lekturę. Stwierdziłem, że będe uczył się powoli, ale ze zrozumieniem, utknąłem jednak w pewnym miejscu. Może ktoś wytłumaczyłby mi jakoś 'łopatologiczniej' tą kwestię?
IIFE use case: inadvertent sharing via closures
Closures keep their connections to outer variables, which is sometimes not what you want:
var result = [];
for (var i=0; i < 5; i++) {
result.push(function () { return i }); // (1)
}
console.log(result[1]()); // 5 (not 1)
console.log(result[3]()); // 5 (not 3)
The value returned in line (1) is always the current value of i, not the value it had when the function was created. After the loop is finished, i has the value 5, which is why all functions in the array return that value. If you want the function in line (1) to receive a snapshot of the current value of i, you can use an IIFE:
for (var i=0; i < 5; i++) {
(function () {
var i2 = i; // copy current i
result.push(function () { return i2 });
}());
}
Dlaczego 1 fragment zwraca 5?? Rozumiem, że w pewnym momencie i = 5, więc pętla zwraca false i nie idzie dalej, ale czemu funkcja zwraca tą właśnie 5 i to za każdym razem? Co niby zmienią tutaj funkcja samowywołująca w drugim fragmencie? Niby jest wyjaśnienie, ale dalej nie czuję tego. Nie mam tego "ahaaa, o to chodzi!". Siedze, patrzę w to.. No i nie mogę sobie jakoś wyjaśnić. Może coś źle tłumaczę na nasz język. Ktoś coś? z góry dzięki. Pozdrawiam.