Voy a ser rápido y saltar directamente a la caja. El código está comentado para que conozcas mis intenciones. Básicamente, estoy construyendo un pequeño juego basado en HTML5, y en contra de guardar cosas en el servidor o en una cookie, solo le proporcionaré al jugador un código de nivel. Cuando un jugador ingresa el código (en forma de un hash simple) en un campo de entrada de texto, y hace clic en un botón para cargar ese nivel, se llama a la función "l". Esa función primero recupera las entradas del jugador, luego recorre la lista de hashes y los compara. Cuando una coincidencia es útil, se supone que ese cierto nivel debe estar cargado, pero hubo errores. Hice un poco de depuración y descubrí que el valor del iterador ("i") ha cambiado dentro de un setTimeout. Quiero hacer una pausa de 1 segundo, porque cargar el nivel inmediatamente sería demasiado rápido y se vería mal.¡setTimeout parece estar cambiando mis variables! ¿Por qué?
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!
}
}
Agradable comentario, tener todos los votos por votos. – ninjagecko
FYI, su código no pasa jslint por varias razones y producirá errores en algunos navegadores –
@MarkSchultheiss, por favor explique, creo que jsLint es una especie de evaluador, ¿es correcto? Bueno, entonces, ¿puedes decirme por qué no calcula esto? – corazza