Będę szybki i wskoczę prosto do walizki. Kod jest komentowany, więc znasz moje intencje. Zasadniczo buduję małą grę opartą na HTML5 i przeciwstawiając się zapisywaniu rzeczy na serwerze lub ciasteczku, po prostu podam graczowi kod poziomu. Kiedy gracz wprowadza kod (w formie prostego skrótu) do pola wprowadzania tekstu i klika przycisk, aby załadować ten poziom, wywoływana jest funkcja "l". Ta funkcja najpierw pobiera wpisy gracza, następnie przechodzi przez listę skrótów i porównuje je. Gdy mecz jest lubiany, ten poziom powinien zostać załadowany, ale wystąpiły błędy. Zrobiłem trochę debugowania i odkryłem, że wartość iteratora ("i") zmieniła się wewnątrz setTimeout! Chcę przerwać 1 sekundę, ponieważ natychmiastowe załadowanie poziomu byłoby po prostu zbyt szybkie i wyglądałoby źle.setTimeout wydaje się zmieniać moje zmienne! Czemu?
levelCodes = //Just a set of "hashes" that the player can enter to load a certain level. For now, only "code" matters.
[
{"code": "#tc454", "l": 0},
{"code": "#tc723", "l": 1},
]
var l = function() //This function is called when a button is pressed on the page
{
var toLoad = document.getElementById("lc").value; //This can be "#tc723", for example
for (i = 0; i < levelCodes.length; i++) //levelCodes.length == 2, so this should run 2 times, and in the last time i should be 1
if (levelCodes[i].code == toLoad) //If I put "#tc723" this will be true when i == 1, and this happens
{
console.log(i); //This says 1
setTimeout(function(){console.log(i)}, 1000); //This one says 2!
}
}
Przyjemne komentowanie, wszystkie przeboje. – ninjagecko
FYI, twój kod nie przekazuje jslint z kilku powodów i spowoduje błędy w niektórych przeglądarkach. –
@MarkSchultheiss, proszę wyjaśnić, myślę, że jsLint jest jakimś ewaluatorem, czy to prawda? Więc możesz mi powiedzieć, dlaczego to nie jest obliczenie? – corazza