Próbuję stopniowo zwiększać licznik. Następujące prace:Zamknięcie Javascript "przechowuje" wartość w niewłaściwym czasie
function _award(points){
var step = 1;
while(points){
var diff = Math.ceil(points/10);
setTimeout("_change_score_by("+diff+");" /* sigh */,
step * 25);
points -= diff;
step++;
}
}
Używa jednak niejawnego eval. Zło! Zamiast tego użyjmy zamknięcia, prawda?
function _award(points){
var step = 1;
while(points){
var diff = Math.ceil(points/10);
setTimeout(function(){ _change_score_by(diff); },
step * 25);
points -= diff;
step++;
}
}
Oczywiście to nie działa. Wszystkie utworzone zamknięcia wychwytują ostatnią wartość, jaką miał diff
w funkcji - 1. Dlatego wszystkie anonimowe funkcje zwiększą licznik o 1, a na przykład _award(100)
zwiększą wynik o 28 zamiast tego.
Jak zrobić to poprawnie?
Za pomocą Functional.js można utworzyć funkcję przechodzenia do 'setTimeout()' w ten sposób: '_change_score_by.saturate (diff)' i nie potrzebujesz anonimowej funkcji. – Pointy
Sądzę, że musiałbyś również przekazać 'step' jako parametr? – badp
@adres nr _setTimeout (param1, param2) _ jest wykonywany właśnie w tej chwili. Tylko "wewnątrz" funkcji _param1_ nie jest oceniane (jest wykonywane później, jak zauważyłeś w swoim wpisie). –