Necesito cambiar una variable global a través de un evento de clic, pero parece (sospecho) que no cambiará el valor de esa variable fuera del evento. Estoy buscando hacer algunos cálculos basados en variables locales de eventos de clic. Cuando lo declaro, recibo un mensaje de que las variables locales no están definidas. Es comprensible porque el evento aún no ha sucedido. Incluso después de que lo haga, puedo leer los valores actualizados de las variables locales en la consola del navegador, pero la variable global aún permanece sin definir.
Aquí hay algunos de los códigos relevantes:
const tanqueSel = document.getElementById("tanqueSel"), soldadoSel = document.getElementById("soldadoSel"), guerreroSel = document.getElementById("guerreroSel"), vikingoSel = document.getElementById("vikingoSel"); let Eleccion tanqueSel.addEventListener("click", clickTanque) function clickTanque() { Eleccion = { ...tanque }; alert("Has seleccionado " + Eleccion.nombre); //I can access the new 'Eleccion' values here, but not outside } soldadoSel.addEventListener("click", clickSoldado) function clickSoldado() { Eleccion = { ...soldado }; alert("Has seleccionado " + Eleccion.nombre); } guerreroSel.addEventListener("click", clickGuerrero) function clickGuerrero() { Eleccion = { ...guerrero }; alert("Has seleccionado " + Eleccion.nombre); } vikingoSel.addEventListener("click", clickVikingo) function clickVikingo() { Eleccion = { ...vikingo }; alert("Has seleccionado " + Eleccion.nombre); } let daño = (Eleccion.ataque - monstruo.defensa); //According to the console this is where the problem is, since 'Eleccion' is undefinedEs un gran antipatrón usar variables globales.
Además, la razón por la que no está undefined es porque está accediendo a esa variable en la pila de llamadas inicial de la aplicación (eso significa que aún no se ha hecho clic, así que sí, no está definido).
Supongo que está tratando de calcular el 'daño' de un método de ataque.
¿Cuándo quieres aplicar ese daño? ¿No debería estar dentro del controlador de clics también?
soldadoSel.addEventListener("click", clickSoldado) function clickSoldado(){ // you can remove completely the global variable and use a generic function attack(soldado); } //...same for every other click listener (you call attack method with the selection) // and create a generic attack function function attack(selected) { alert("Has seleccionado " + selected.nombre); let daño = selected.ataque - monstruo.defensa; // here you have the damage, you can do what you want with it. //... }